【问题标题】:Delete duplicates by keeping the cheapest price only只保留最便宜的价格来删除重复项
【发布时间】: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


【解决方案1】:

我会使用相关子查询来做到这一点:

delete from mytable t
where t.price > (select min(t2.price) from mytable t2 where t2.sku = t.sku);

【讨论】:

    【解决方案2】:

    这是一种使用 Postgres DELETE ... USING 语法的解决方案:

    DELETE 
    FROM mytable t1
    USING mytable t2
    WHERE t1.sku = t2.sku AND t1.price > t2.price
    

    这将删除具有重复 skus 的记录,同时保留具有最小 price 的记录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-10
      • 2022-01-16
      • 2022-07-19
      • 2015-03-19
      • 2018-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多