【发布时间】:2019-08-30 01:50:54
【问题描述】:
我正在处理存储在 PostgreSQL 数据库中的产品目录(电子商务)。我目前有重复。我想删除那些重复的产品,只保留最便宜的。
数据库中重要的字段:
ID [PK] SKU EAN Price ....
1 SKU1 123 45.0 ....
2 SKU2 456 36.0 ....
3 SKU3 123 40.0 ....
4 SKU4 789 58.0 ....
5 SKU5 123 38.0 ....
...
我在字段 ID 上有一个序列主键。 我有一个 NOT NULL SKU、一个 NOT NULL EAN-13 代码和每个产品的 NOT NULL 价格。
我们可以看到 EAN“123”被重复了好几次。我想找到一个删除所有重复项(所有行)的 SQL 请求,只保留一个,这将具有最低的价格。
我们会:
ID [PK] SKU EAN Price ....
2 SKU2 456 36.0 ....
4 SKU4 789 58.0 ....
5 SKU5 123 38.0 ....
...
要知道:重复的数量是可变的。这是一个示例,其中 3 个产品具有相同的 EAN,但我们可以有 2、4、8 或 587...
到目前为止,我已经能够在只有 2 个重复项的情况下删除具有最低或最大 ID 的重复项,但这不是我想要找到的......
FROM
(SELECT Price,
MIN(Price) OVER( PARTITION BY ean ORDER BY Price DESC ) AS row_num FROM TABLE ) t
WHERE t.row_num > 1 );
【问题讨论】:
-
不应该是
Price ASC吗?这样,最便宜的将具有等于1的 row_number。
标签: sql postgresql duplicates sql-delete