我正在处理存储在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上有一个SERIAL PRIMARY KEY。 我有一个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 );
答案 0 :(得分:0)
以下是一种使用Postgres DELETE ... USING
语法的解决方案:
DELETE
FROM mytable t1
USING mytable t2
WHERE t1.sku = t2.sku AND t1.price > t2.price
这将删除重复sku
的记录,同时保留price
最小的记录。
答案 1 :(得分:0)
我将使用相关子查询来做到这一点:
delete from mytable t
where t.price > (select min(t2.price) from mytable t2 where t2.sku = t.sku);
答案 2 :(得分:0)
我想我正在搜索太复杂的东西!谢谢大家:)