我有一个看起来像这样的表:
type date amount
-----------------------------
A 17/06/2019 5
A 18/06/2019 8
A 19/06/2019 10
B 17/06/2019 1
B 18/06/2019 9
C 17/06/2019 4
我想做的是删除每种类型的最后一行(包括也只有一行的类型)。因此,结果应如下所示:
type date amount
-----------------------------
A 17/06/2019 5
A 18/06/2019 8
B 17/06/2019 1
我尝试使用窗口函数LEAD
检查下一行,如果当前行的类型与下一行的类型不同,则将其删除。像这样:
DELETE FROM table
WHERE ((LEAD(type, 1) over (partition by type order by date)) != type ));
我使用了partition
和order by
来确保对数据进行了应有的排序。但是我才意识到我不能在WHERE子句中使用window函数。因此,根据我要达到的目标,我该怎么做?
答案 0 :(得分:1)
如果您要实际删除数据:
delete from t
where t.date = (select max(t2.date) from t t2 where t2.type = t.type);
如果您只想选择数据:
select t.*
from t
where t.date < (select max(t2.date) from t t2 where t2.type = t.type);
在这种情况下,尝试使用窗口功能没有优势。为了提高性能,请在(type, date)
上创建索引。
答案 1 :(得分:0)
您可以使用窗口函数ROW_NUMBER()
查找这些行,如下所示:
delete from t
where (type, date) in (
select type, date
from (
select type, date,
row_number() over(partition by type order by date desc) as rn
) x
where rn = 1
)