【问题标题】:Remove duplicates for the same product id only仅删除相同产品 ID 的重复项
【发布时间】:2019-07-12 19:22:26
【问题描述】:

表格包含产品的图像。每行指向产品图片的 URL。许多产品都有多张图片。

url > Image url
product_id > Product's ID

某些产品有重复的图像。我只需要从重复项中保留一个,并删除该产品的其他重复 URL。

我无法对 URL 进行分组并删除重复项,因为可能有另一行具有相同的 URL 并具有不同的 product_id。

TABLE
-
id | product_id | url | is_primary

【问题讨论】:

  • 您能否展示示例数据(几行)和预期结果?我无法理解您的要求I want to remove duplicates with the same URL ... but I cannot remove duplicates because there might be another row that has the same URL and have different product_id - 您的意思是“仅删除相同产品 ID 的重复项”吗?
  • 图片上传为例
  • @sirdavalos 。 . .您更新的数据没有重复的产品。

标签: sql postgresql duplicates sql-delete


【解决方案1】:

您可以使用 EXISTS 删除重复项:

delete from tablename t
where exists (
  select 1 from tablename
  where product_id = t.product_id and url = t.url and id < t.id
)

这将只是每个product_id 的重复网址之一,即具有最小id 的网址。

【讨论】:

    【解决方案2】:

    根据如何您希望对记录进行重复数据删除,有几种不同的方法可以完成此操作。最直接的就是:

    SELECT
        DISTINCT ON (product_id)
              id
            , product_id
            , url
            , is_primary
    FROM table
    

    来自documentation

    SELECT DISTINCT 从结果中消除重复行。 SELECT DISTINCT ON 消除与所有指定表达式匹配的行。 SELECT ALL(默认)将返回所有候选行,包括重复行。 (参见下面的 DISTINCT 子句。)

    听起来您可能想要使用 DISTINCT ON 而不是 DISTINCT;区别在于 DISTINCT ON 允许您返回列不是不同组件的一部分。


    如果您需要做一些更复杂的事情(例如,找到与product_id 关联的最小的id),您可以向查询添加排序,这将通过添加 ORDER BY 子句使结果具有确定性。

    关于与 DISTINCT ON 结合使用的 ORDER BY 子句需要注意的是,DISTINCT ON 中的所有列都必须在 ORDER BY 中排在第一位。因此,可以找到与每个产品相关联的最小 id,例如:

    SELECT
        DISTINCT ON (product_id)
              id
            , product_id
            , url
            , is_primary
    FROM table
    ORDER BY
          product_id
        , id ASC 
    

    根据此表的设置方式,可能会有更简单的答案。如果is_primary 是一个具有部分唯一索引的布尔列(有关更多详细信息,请参阅this postthis documentation),您可以通过如下查询获得一个id 每个product_id

    SELECT
          id
        , product_id
        , url
        , is_primary
    FROM table
    WHERE is_primary
    

    我之所以提到这一点,是因为它是一种非常好的过滤单个唯一值的方法如果您的数据库是以这种方式设置的。根据您的表大小,它也可能具有更高的性能,因为 Postgres 将在磁盘上有一个索引,并且不需要对所有可能的记录进行排序。


    如果您的目标是实际从表中删除重复记录,一种方法是使用有效记录形成查询(例如上述之一),然后将其用作 USING 子句带有 WHERE NOT EXISTS 子句的 DELETE 语句。

    【讨论】:

      猜你喜欢
      • 2021-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多