SQL SELECT MAX()返回多个记录

时间:2017-06-02 16:21:39

标签: sql sql-server

我正在尝试编写一个带有MAX ID2和MAX DATETIME记录的SQL查询

在我目前的结果中,

有记录具有相同的nmae和special_number。它们仅因ID2和Date_Time而不同。 special_number应该是唯一的,没有重复。如果有重复的special_number,请选择max 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

4 个答案:

答案 0 :(得分:2)

你可以使用top n with ties

Select top (1) with ties * from yourtable
    order by row_number() over(partition by name order by Id2 desc)

答案 1 :(得分:1)

嗯,你的结果很独特,我怀疑你想根据日期得到最新的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;

答案 2 :(得分:0)

获得多条记录的原因是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,如果没有明确指示选择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

答案 3 :(得分:0)

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