d****f 发帖数: 313 | 1 现在有个表
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
我感觉是很基本的一个查询,因为很久不接触数据库了,谢谢各位! | i****a 发帖数: 36252 | 2 select *
from
(
select *
, rank() over (partition PID order by Reading) as readingRank
from yourTable
where Reading > 2
group by PID
) ranking
where ranking.readingRank = 1
【在 d****f 的大作中提到】 : 现在有个表 : 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
| d****f 发帖数: 313 | 3 楼上的办法怎么感觉有点不通用阿,我目前自己有个办法,就是先按照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
这样做是不是感觉更通用一些? | c*******e 发帖数: 8624 | 4 没人会这么做
【在 d****f 的大作中提到】 : 楼上的办法怎么感觉有点不通用阿,我目前自己有个办法,就是先按照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 : (
| d****f 发帖数: 313 | 5 why?
【在 c*******e 的大作中提到】 : 没人会这么做
| B*****g 发帖数: 34098 | 6 因为这个版的人都知道partition by了。google一下就会了
【在 d****f 的大作中提到】 : why?
| d****f 发帖数: 313 | 7 不好意思,可能偶的知识过时了,偶上次操作ACCESS是8年前了,Partition以前在自学SQL时(数据库系统概论)从没听过,可否稍微科普一下(省去我GOOGLE的时间)?另外我之前JOIN的做法有什么问题,是否也是一个教科书上的办法?怎么GOOGLE了一下Partition and rank好像SQL SERVER 2005才加入的新内容?
http://weblogs.sqlteam.com/jeffs/archive/2007/03/28/60146.aspx
【在 B*****g 的大作中提到】 : 因为这个版的人都知道partition by了。google一下就会了
| B*****g 发帖数: 34098 | 8 1. access应该还不能用partition by。
2. 你的做法没问题,过时而已。
3. sql server好久没搞了,最近因工作需要才又搞了几下,不过我不看sql server的书
。看有没有其他sql server大拿跳出来给你建议。
4. sql server 2011就要出来了,呵呵。
【在 d****f 的大作中提到】 : 不好意思,可能偶的知识过时了,偶上次操作ACCESS是8年前了,Partition以前在自学SQL时(数据库系统概论)从没听过,可否稍微科普一下(省去我GOOGLE的时间)?另外我之前JOIN的做法有什么问题,是否也是一个教科书上的办法?怎么GOOGLE了一下Partition and rank好像SQL SERVER 2005才加入的新内容? : http://weblogs.sqlteam.com/jeffs/archive/2007/03/28/60146.aspx
| d****f 发帖数: 313 | 9 谢谢回复,不过我必须用过时的Access 2003(.MDB),也不需要什么SQL Server,有
个解决办法就可以,另外从我google的那个帖子看起来这种方法虽然过时,效率却很高
呢, ,看来凡事还是要具体分析的
http://weblogs.sqlteam.com/jeffs/archive/2007/03/28/60146.aspx
的书
【在 B*****g 的大作中提到】 : 1. access应该还不能用partition by。 : 2. 你的做法没问题,过时而已。 : 3. sql server好久没搞了,最近因工作需要才又搞了几下,不过我不看sql server的书 : 。看有没有其他sql server大拿跳出来给你建议。 : 4. sql server 2011就要出来了,呵呵。
| c*******e 发帖数: 8624 | 10 如果有超过一条记录符合min的条件,你那么join得到的结果不唯一
【在 d****f 的大作中提到】 : 谢谢回复,不过我必须用过时的Access 2003(.MDB),也不需要什么SQL Server,有 : 个解决办法就可以,另外从我google的那个帖子看起来这种方法虽然过时,效率却很高 : 呢, ,看来凡事还是要具体分析的 : http://weblogs.sqlteam.com/jeffs/archive/2007/03/28/60146.aspx : : 的书
| | | d****f 发帖数: 313 | 11 我的Reading是唯一的,应该保证唯一性了吧
另外若Min(Reading)对应记录不唯一,用Partition,Rank可保证唯一吗
(假设可以用SQL Server 2005以上,不限定用ACCESS)?
【在 c*******e 的大作中提到】 : 如果有超过一条记录符合min的条件,你那么join得到的结果不唯一
| a9 发帖数: 21638 | 12 怎么会不唯一呢。
,有
很高
【在 c*******e 的大作中提到】 : 如果有超过一条记录符合min的条件,你那么join得到的结果不唯一
| d****f 发帖数: 313 | 13 他说的可能是Min(Reading)可能对应多个记录的情况(我这里无此情况),但是这样的
话,用Partition就能保证唯一性了吗?概念上感觉不行
【在 a9 的大作中提到】 : 怎么会不唯一呢。 : : ,有 : 很高
| a9 发帖数: 21638 | 14 min函数只会返回一条记录吧?
【在 d****f 的大作中提到】 : 他说的可能是Min(Reading)可能对应多个记录的情况(我这里无此情况),但是这样的 : 话,用Partition就能保证唯一性了吗?概念上感觉不行
| c*******e 发帖数: 8624 | 15 min当然是唯一的,但是第二部join的时候不一定唯一.
qualify跟是否唯一无关,我用的row_number()就是唯一的
但是rank则不一定
【在 a9 的大作中提到】 : min函数只会返回一条记录吧?
| d****f 发帖数: 313 | 16 join不唯一的话,就是事实上的记录不唯一了,比如Reading=4对应多条记录,那样的
话,无论用Partition还是用Join都无法保证唯一了吧,若是只返回一条记录,反而是错误的了
【在 c*******e 的大作中提到】 : min当然是唯一的,但是第二部join的时候不一定唯一. : qualify跟是否唯一无关,我用的row_number()就是唯一的 : 但是rank则不一定
| c*******e 发帖数: 8624 | 17 跟你想要什么有关,你想要都返回还是只要一条?
已经说过了,这个跟qualify或者partition无关,跟你用
rank还是row_number有关
错误的了
【在 d****f 的大作中提到】 : join不唯一的话,就是事实上的记录不唯一了,比如Reading=4对应多条记录,那样的 : 话,无论用Partition还是用Join都无法保证唯一了吧,若是只返回一条记录,反而是错误的了
| d****f 发帖数: 313 | 18 感觉是个很简单的问题,跟原来的表原始内容,结构(比如Reading是不是会有重复)有
关,和用什么方法查询出来无关,如果真的是有重复的,就应该把重复的都列出来,只
要是qualify条件的,和rank,row_number无关
【在 c*******e 的大作中提到】 : 跟你想要什么有关,你想要都返回还是只要一条? : 已经说过了,这个跟qualify或者partition无关,跟你用 : rank还是row_number有关 : : 错误的了
| c*******e 发帖数: 8624 | 19 你回答了第一个问题.如果你要重复就用rank,就这么简单.
还不明白的话,建议你改行.
【在 d****f 的大作中提到】 : 感觉是个很简单的问题,跟原来的表原始内容,结构(比如Reading是不是会有重复)有 : 关,和用什么方法查询出来无关,如果真的是有重复的,就应该把重复的都列出来,只 : 要是qualify条件的,和rank,row_number无关
|
|