求最小值对应的全记录SQL经典查询问题

dbxmcf 2010-07-10 03:31:23
现在有个表
PID,Depth,Reading,Percent
A-1,1.0,4,75
A-1,1.0,3,62
A-1,1.0,2,50
A-1,1.0,1,40

A-1,2.1,5,76
A-1,2.1,3,63
A-1,2.1,2,50
A-1,2.1,1,40

A-2,1.5,6,99
A-2,1.5,5,87
A-2,1.5,4,78

A-2,2.5,5,73
A-2,2.5,4,62
A-2,2.5,2,62
A-2,2.5,1,50

怎么求每个点PID,每个深度Depth,每个读数Reading大于2的那条最小的记录?要求同时给出那个对应的百分比Percent
比如对第一组记录,就返回:
A-1,1.0,3,62

我感觉是很基本的一个查询,因为很久不接触数据库了,谢谢各位!
...全文
369 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwwwb 2010-07-12
  • 打赏
  • 举报
回复
or
SELECT a.* from tth a
where a.Reading>2 and not exists(select 1 from tth b where b.Reading>2 and a.PID=b.PID and a.Depth=b.Depth and a.Percent>b.Percent)
wwwwb 2010-07-12
  • 打赏
  • 举报
回复
SELECT a.* from tth a inner join
(select PID,Depth,min(Percent) as mi from tth where Reading>2 group by PID,Depth) b
on a.PID=b.PID and a.Depth=b.Depth and a.Percent=b.mi
dbxmcf 2010-07-11
  • 打赏
  • 举报
回复
google一下后基本确定Access就得用join方法,因为不是SQL Server还可以用新的Partition, Rank等等,但是JOIN似乎还是最高效的办法,见帖子:

http://weblogs.sqlteam.com/jeffs/archive/2007/03/28/60146.aspx

感觉这种查询应该很经典,因为需要的情况太多了,等会做个总结吧

[Quote=引用 9 楼 acmain_chm 的回复:]
准备一个测试用的MDB文件,包括你一楼的测试数据,然后出定针对这些测试数据的正确结果。 这样别人可以直接用的你的数据进行调试。

可以上传到 http://www.access911.net/csdn
[/Quote]
ACMAIN_CHM 2010-07-11
  • 打赏
  • 举报
回复
准备一个测试用的MDB文件,包括你一楼的测试数据,然后出定针对这些测试数据的正确结果。 这样别人可以直接用的你的数据进行调试。

可以上传到 http://www.access911.net/csdn
dbxmcf 2010-07-11
  • 打赏
  • 举报
回复
"每个点PID,每个深度Depth,每个读数Reading大于2的那条最小的记录"

可能说的不是特别明了让你混淆了,没有要求最小深度的意思(因为是按照深度分组的,所以每组记录深度都一样),我的最小值只是针对那个读数Reading,是Reading大于2的最小值,如果是3,就3,若是4,就4,然后是这个值对应的全记录,只是针对这一个Reading的分组最小,不牵涉别的字段

[Quote=引用 7 楼 chenfuxiangcfx 的回复:]
引用楼主 dbxmcf 的回复:
怎么求每个点PID,每个深度Depth,每个读数Reading大于2的那条最小的记录?要求同时给出那个对应的百分比Percent
比如对第一组记录,就返回:
A-1,1.0,3,62



觉得你提的问就有问题。读数Reding大于2的,深度Depth的最小值不是唯一的,
A-1,1.0,4,75
这条记录,也是大于2,深度Depth的最小值。
[/Quote]
ACMAIN_CHM 2010-07-10
  • 打赏
  • 举报
回复
#3楼 的贴子中已经讨论了很多种方法了。
dbxmcf 2010-07-10
  • 打赏
  • 举报
回复
我目前自己有个办法,就是先按照PID,DEPTH分组
,求出MIN(Reading)
SELECT PID, DEPTH, MIN(READING) AS MINR
FROM TABLE
WHERE READING>2
GROUP BY PID, DEPTH

然后再基于上面的结论把原表JOIN过来
SELEC A.PID, A.DEPTH, A.MINR, TABLE.PERCENT
FROM
(
SELECT PID, DEPTH, MIN(READING) AS MINR
FROM TABLE
WHERE READING>2
GROUP BY PID, DEPTH
) AS A LEFT JOIN TABLE
ON A.PID=TABLE.PID AND A.DEPTH=TABLE.DEPTH AND A.MINR=TABLE.READING
这样做是不是通用办法?


[Quote=引用 4 楼 acmain_chm 的回复:]
select * from 现在有个表 a where Reading>2 and not exists(select 1 from 现在有个表 where PID=a.PID and Depth=a.Depth and Reading<a.Reading and Reading>2)
[/Quote]
ACMAIN_CHM 2010-07-10
  • 打赏
  • 举报
回复
select * from 现在有个表 a where Reading>2 and not exists(select 1 from 现在有个表 where PID=a.PID and Depth=a.Depth and Reading<a.Reading and Reading>2)
ACMAIN_CHM 2010-07-10
  • 打赏
  • 举报
回复
参考下贴中的多种方法

http://topic.csdn.net/u/20091231/16/2f268740-391e-40f2-a15e-f243b2c925ab.html
[征集]分组取最大N条记录方法征集,及散分....
dbxmcf 2010-07-10
  • 打赏
  • 举报
回复
这样做不对吧,我不需要Min(Percent),更不需要Min(Depth)
因为是需要按照PID和Depth分组的
GROUP BY PID, DEPTH

[Quote=引用 1 楼 chenfuxiangcfx 的回复:]
SELECT PID, Min(Depth) AS Depth之最小值, Min(Percent) AS Percent之最小值, Min(Reading) AS Reading之最小值 FROM 表名 WHERE Reading>2 GROUP BY PID;
[/Quote]
chenfuxiangcfx 2010-07-10
  • 打赏
  • 举报
回复
SELECT PID, Min(Depth) AS Depth之最小值, Min(Percent) AS Percent之最小值, Min(Reading) AS Reading之最小值 FROM 表名 WHERE Reading>2 GROUP BY PID;
chenfuxiangcfx 2010-07-10
  • 打赏
  • 举报
回复
[Quote=引用楼主 dbxmcf 的回复:]
怎么求每个点PID,每个深度Depth,每个读数Reading大于2的那条最小的记录?要求同时给出那个对应的百分比Percent
比如对第一组记录,就返回:
A-1,1.0,3,62

[/Quote]

觉得你提的问就有问题。读数Reding大于2的,深度Depth的最小值不是唯一的,
A-1,1.0,4,75
这条记录,也是大于2,深度Depth的最小值。

7,712

社区成员

发帖
与我相关
我的任务
社区描述
Microsoft Office Access是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点。
社区管理员
  • Access
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧