繁体   English   中英

SQL SELECT MAX()返回多个记录

[英]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

由于IDID2SPECIAL_NUMBERDATE_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-052017-06-04 ,和DB不能决定应该选择哪一个没有你的明确指示,选择MAX

我尝试了MAX但是没有用

您非常接近-删除DISTINCT ,然后从列表中删除ID2DATE_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM