删除与PostgreSQL下一行具有不同值的行

时间:2019-06-17 13:57:50

标签: sql postgresql

我有一个看起来像这样的表:

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 ));

我使用了partitionorder by来确保对数据进行了应有的排序。但是我才意识到我不能在WHERE子句中使用window函数。因此,根据我要达到的目标,我该怎么做?

2 个答案:

答案 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
)