删除重复的SQL

时间:2018-04-26 20:35:12

标签: sql sql-server

我有桌子:

╔════╤════════════╗
║ id │ date       ║
╠════╪════════════╣
║ 1  │ 2001-08-01 ║
╟────┼────────────╢
║ 1  │ 2001-09-02 ║
╟────┼────────────╢
║ 1  │ 2001-09-02 ║
╟────┼────────────╢
║ 1  │ 2001-09-01 ║
╟────┼────────────╢
║ 2  │ 2000-01-01 ║
╟────┼────────────╢
║ 3  │ 2000-09-01 ║
╚════╧════════════╝

并希望使用代码

接收最长日期
SELECT tt.*
FROM data tt
inner join(
SELECT id, max(data) as lastDate
FROM data
GROUP BY id) groupedtt
ON tt.id = groupedtt.id AND tt.data = groupedtt.lastDate

但通过此代码我得到重复的值,如

╔════╤════════════╗
║ id │ date       ║
╠════╪════════════╣
║ 1  │ 2001-09-02 ║
╟────┼────────────╢
║ 1  │ 2001-09-02 ║
╟────┼────────────╢
║ 2  │ 2000-01-01 ║
╟────┼────────────╢
║ 3  │ 2000-09-01 ║
╚════╧════════════╝

我应该改变什么来获得没有像这样的重复的表:

╔════╤════════════╗
║ id │ date       ║
╠════╪════════════╣
║ 1  │ 2001-09-02 ║
╟────┼────────────╢
║ 2  │ 2000-01-01 ║
╟────┼────────────╢
║ 3  │ 2000-09-01 ║
╚════╧════════════╝

我正在使用ms sql server

2 个答案:

答案 0 :(得分:3)

只需使用您用来加入原始表的查询:

SELECT id, max(date) as [date]
FROM data
GROUP BY id;

答案 1 :(得分:1)

如果您想要整行,请使用row_number()

select tt.*
from (select tt.*, row_number() over (partition by id order by data desc) as seqnum
      from data tt
     ) tt
where seqnum = 1;

我猜这个行还有其他你想要的字段,因为你的子查询完全符合你想要的那样。