我正在尝试编写一个带有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
答案 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
由于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
,如果没有明确指示选择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
答案 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