仅保留最便宜的价格来删除重复项

时间:2019-04-08 20:42:56

标签: sql postgresql duplicates sql-delete

我正在处理存储在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 );

3 个答案:

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

我想我正在搜索太复杂的东西!谢谢大家:)