我的数据是:
ID Name date
1 Ben 2017-01-21
2 Mark 2017-01-20
3 Mark 2017-01-21
4 Ell 2017-01-19
它应该是
ID Name date
1 Ben 2017-01-21
3 Mark 2017-01-21
4 Ell 2017-01-19
只是旧的"标记"必须删除ID为2的
答案 0 :(得分:4)
如果您只想返回姓名的最新行,可以使用:
select t.*
from t
where t.date = (select max(t2.date) from t t2 where t2.name = t.name);
在大多数数据库中,您可以对delete
使用类似的逻辑:
delete from t
where t.date < (select max(t2.date) from t t2 where t2.name = t.name)
答案 1 :(得分:0)
您可以使用以下查询。我通常避免在select中添加子查询或在哪里避免性能问题。
Select id, name date from mydata x
inner join (SELECT name,MAX(date) from mydata group by name) y on x.name=y.name
答案 2 :(得分:0)
看起来表格不是normalized。但是,如果数据库是SQL Server 2008及更高版本,则以下问题应该有效,credit:
WITH cte AS (
SELECT Id, Name, [Date]
row_number() OVER(PARTITION BY Name ORDER BY [date]) AS [RowNum]
FROM YourTable
)
DELETE cte WHERE [RowNum] > 1