问题描述
我想删除条件为更新日期小于最大更新日期的重复行。但是,我无法删除它们。
我的尝试:
SELECT * FROM (
SELECT *,ROW_NUMBER() OVER(PARTITION BY order_code,customer_id,id,sign_date ORDER BY updated_at DESC) AS Row
FROM fulfillment_bill_transactions WHERE active =1 AND transaction_type= 2
) dups
WHERE
dups.Row > 1
我的查询结果显示了具有最小更新日期的行,但不是除最大日期之外的所有更新日期。
示例如下:
表A:
ID | 签署日期 | 客户 ID | 订单代码 | updated_at |
---|---|---|---|---|
A | 2021/01/01 | 001 | AB | 2020/01/02 |
A | 2021/01/01 | 001 | AB | 2020/01/03 |
A | 2021/01/01 | 001 | AB | 2020/01/12 |
B | 2021/01/03 | 002 | LL | 2020/02/02 |
B | 2021/01/03 | 002 | LL | 2020/02/03 |
B | 2020/01/03 | 002 | LL | 2020/02/04 |
想要的结果:
ID | 签署日期 | 客户 ID | 订单代码 | updated_at |
---|---|---|---|---|
A | 2021/01/01 | 001 | AB | 2020/01/12 |
B | 2020/01/03 | 002 | LL | 2020/02/04 |
解决方法
如果要删除除最高更新日期之外的所有重复行,则可以使用以下查询:
delete FROM fulfillment_bill_transactions t
WHERE exists (select 1 from fulfillment_bill_transactions tt
where tt.id = t.id
AND tt.updated_date > t.updated_date);
,
在 Postgres 中,如果您想要每组一行,那么我建议使用 distinct on
。对于您提供的示例数据,这将是:
select distinct on (id) fbt.*
from fulfillment_bill_transactions fbt
order by id,date desc;
不清楚您的代码与问题有什么关系。指的是样本数据中没有的列,问题中没有描述过滤条件。