[英]SQL SELECT MAX() is returning multiple records
我正在尝试编写一个SQL查询,该查询返回具有最大ID2和最大日期时间的记录
根据我目前的结果,
有些记录具有相同的nmae和special_number。 它们的区别仅在于ID2和Date_Time。 special_number应该是唯一的,并且不能重复。 如果重复的special_number,请选择最大ID2和date_time的记录
对于重复项(有很多重复项),我只需要选择MAx ID2和DATE_TIME的记录。 例如,ADDEN CROSS,我只需要带回ID2 = 333和2017-05-05的ADDEN CROSS。
我尝试了MAX,但是没有用
SELECT DISTINCT ID, NAME, MAX(ID2), SPECIAL_NUMBER and DATE_TIME
FROm TABLE1
WHERE DATE_TIME BETWEEN @START_DATE and @END_DATE
GROUP BY ID, ID2, SPECIAL_NUMBER, DATE_TIME
任何帮助表示赞赏。 谢谢
我目前的结果
ID NAME ID2 SPECIAL_NUMBER DATE_TIME
123 JOE SMITH 456 D123 2017-06-05
123 JOE SMITH 455 D123 2017-06-04
124 JIM DONE 111 E111 2017-06-02
122 ME TOO 222 G111 2017-06-01
146 ADDEN CROSS 333 R555 2017-05-05
146 ADDEN CROSS 332 R555 2017-05-04
146 ADDEN CROSS 331 R555 2017-05-02
我的预期结果
ID NAME ID2 SPECIAL_NUMBER DATE_TIME
123 JOE SMITH 456 D123 2017-06-05
124 JIM DONE 111 E111 2017-06-02
122 ME TOO 222 G111 2017-06-01
146 ADDEN CROSS 333 R555 2017-05-05
您可以将top n与领带配合使用,如下所示
Select top (1) with ties * from yourtable
order by row_number() over(partition by name order by Id2 desc)
好吧,您的结果是唯一的,我怀疑您想根据日期获取最新的ID2。
在这种情况下,您可以使用ROW_NUMBER()
。
SELECT *
FROM ( SELECT ROW_NUMBER() OVER (PARTITION BY ID, NAME, SPECIAL_NUMBER, DATE_TIME ORDER BY ID2 DESC) AS RN
, ID
, NAME
, ID2
, SPECIAL_NUMBER
, DATE_TIME
FROM TABLE1
WHERE DATE_TIME BETWEEN @START_DATE and @END_DATE) AS T
WHERE T.RN = 1;
您获得多个记录的原因是GROUP BY
子句。
在顶部考虑两行:
ID NAME ID2 SPECIAL_NUMBER DATE_TIME
123 JOE SMITH 456 D123 2017-06-05
123 JOE SMITH 455 D123 2017-06-04
由于ID
, ID2
, SPECIAL_NUMBER
和DATE_TIME
都是GROUP BY
中的所有列,因此SQL无法将这两个记录合并为一个符合您期望的记录:
ID NAME ID2 SPECIAL_NUMBER DATE_TIME
123 JOE SMITH 456 D123 2017-06-05
ID2
的值可以是455或456; SQL无法胜过另一种。 同样, DATE_TIME
可能是2017-06-05
或2017-06-04
,和DB不能决定应该选择哪一个没有你的明确指示,选择MAX
。
我尝试了
MAX
但是没有用
您非常接近-删除DISTINCT
,然后从列表中删除ID2
和DATE_TIME
:
SELECT ID, NAME, MAX(ID2), SPECIAL_NUMBER, MAX(DATE_TIME)
FROM TABLE1
WHERE DATE_TIME BETWEEN @START_DATE and @END_DATE
GROUP BY ID, SPECIAL_NUMBER
WITH e AS ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY ID, Name, SPECIAL_NUMBER ORDER BY ID2 DESC ) AS R FROM TABLE1 ) SELECT ID, NAME, ID2, SPECIAL_NUMBER, DATE_TIME FROM e WHERE DATE_TIME BETWEEN @START_DATE and @END_DATE
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.