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
我感觉是很基本的一个查询,因为很久不接触数据库了,谢谢各位!
12 个解决方案
#1
SELECT PID, Min(Depth) AS Depth之最小值, Min(Percent) AS Percent之最小值, Min(Reading) AS Reading之最小值 FROM 表名 WHERE Reading>2 GROUP BY PID;
#2
这样做不对吧,我不需要Min(Percent),更不需要Min(Depth)
因为是需要按照PID和Depth分组的
GROUP BY PID, DEPTH
因为是需要按照PID和Depth分组的
GROUP BY PID, DEPTH
#3
参考下贴中的多种方法
http://topic.csdn.net/u/20091231/16/2f268740-391e-40f2-a15e-f243b2c925ab.html
[征集]分组取最大N条记录方法征集,及散分....
http://topic.csdn.net/u/20091231/16/2f268740-391e-40f2-a15e-f243b2c925ab.html
[征集]分组取最大N条记录方法征集,及散分....
#4
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)
#5
我目前自己有个办法,就是先按照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
这样做是不是通用办法?
,求出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
这样做是不是通用办法?
#6
#3楼 的贴子中已经讨论了很多种方法了。
#7
觉得你提的问就有问题。读数Reding大于2的,深度Depth的最小值不是唯一的,
A-1,1.0,4,75
这条记录,也是大于2,深度Depth的最小值。
#8
"每个点PID,每个深度Depth,每个读数Reading大于2的那条最小的记录"
可能说的不是特别明了让你混淆了,没有要求最小深度的意思(因为是按照深度分组的,所以每组记录深度都一样),我的最小值只是针对那个读数Reading,是Reading大于2的最小值,如果是3,就3,若是4,就4,然后是这个值对应的全记录,只是针对这一个Reading的分组最小,不牵涉别的字段
可能说的不是特别明了让你混淆了,没有要求最小深度的意思(因为是按照深度分组的,所以每组记录深度都一样),我的最小值只是针对那个读数Reading,是Reading大于2的最小值,如果是3,就3,若是4,就4,然后是这个值对应的全记录,只是针对这一个Reading的分组最小,不牵涉别的字段
#9
#10
google一下后基本确定Access就得用join方法,因为不是SQL Server还可以用新的Partition, Rank等等,但是JOIN似乎还是最高效的办法,见帖子:
http://weblogs.sqlteam.com/jeffs/archive/2007/03/28/60146.aspx
感觉这种查询应该很经典,因为需要的情况太多了,等会做个总结吧
http://weblogs.sqlteam.com/jeffs/archive/2007/03/28/60146.aspx
感觉这种查询应该很经典,因为需要的情况太多了,等会做个总结吧
#11
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
(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
#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)
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)
#1
SELECT PID, Min(Depth) AS Depth之最小值, Min(Percent) AS Percent之最小值, Min(Reading) AS Reading之最小值 FROM 表名 WHERE Reading>2 GROUP BY PID;
#2
这样做不对吧,我不需要Min(Percent),更不需要Min(Depth)
因为是需要按照PID和Depth分组的
GROUP BY PID, DEPTH
因为是需要按照PID和Depth分组的
GROUP BY PID, DEPTH
#3
参考下贴中的多种方法
http://topic.csdn.net/u/20091231/16/2f268740-391e-40f2-a15e-f243b2c925ab.html
[征集]分组取最大N条记录方法征集,及散分....
http://topic.csdn.net/u/20091231/16/2f268740-391e-40f2-a15e-f243b2c925ab.html
[征集]分组取最大N条记录方法征集,及散分....
#4
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)
#5
我目前自己有个办法,就是先按照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
这样做是不是通用办法?
,求出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
这样做是不是通用办法?
#6
#3楼 的贴子中已经讨论了很多种方法了。
#7
觉得你提的问就有问题。读数Reding大于2的,深度Depth的最小值不是唯一的,
A-1,1.0,4,75
这条记录,也是大于2,深度Depth的最小值。
#8
"每个点PID,每个深度Depth,每个读数Reading大于2的那条最小的记录"
可能说的不是特别明了让你混淆了,没有要求最小深度的意思(因为是按照深度分组的,所以每组记录深度都一样),我的最小值只是针对那个读数Reading,是Reading大于2的最小值,如果是3,就3,若是4,就4,然后是这个值对应的全记录,只是针对这一个Reading的分组最小,不牵涉别的字段
可能说的不是特别明了让你混淆了,没有要求最小深度的意思(因为是按照深度分组的,所以每组记录深度都一样),我的最小值只是针对那个读数Reading,是Reading大于2的最小值,如果是3,就3,若是4,就4,然后是这个值对应的全记录,只是针对这一个Reading的分组最小,不牵涉别的字段
#9
#10
google一下后基本确定Access就得用join方法,因为不是SQL Server还可以用新的Partition, Rank等等,但是JOIN似乎还是最高效的办法,见帖子:
http://weblogs.sqlteam.com/jeffs/archive/2007/03/28/60146.aspx
感觉这种查询应该很经典,因为需要的情况太多了,等会做个总结吧
http://weblogs.sqlteam.com/jeffs/archive/2007/03/28/60146.aspx
感觉这种查询应该很经典,因为需要的情况太多了,等会做个总结吧
#11
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
(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
#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)
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)