【问题标题】:SQL query to map duplicated entries for data enrichment用于映射重复条目以丰富数据的 SQL 查询
【发布时间】:2014-11-04 12:18:35
【问题描述】:

我对 PostgreSQL 还很陌生。

我计划通过 Mechanical turk 运行产品数据集,以通过定价信息丰富数据。问题是我有 80,000 条用户上传的记录,其中许多实际上是重复的,尽管它们可能有其他参数不重复。

如果我从 SELECT DISTINCT 查询中丰富数据,问题是我无法将该数据添加到实际的“重复”条目中。

如何查看从 SELECT DISTINCT 查询中删除的所有行,以便稍后返回并使用新数据丰富这些行?

【问题讨论】:

  • that I have 80,000 records uploaded by users, many of which are in actuality duplicates, although they may have other parameters not duplicate. 请了解数据建模。您存储在一个表中的内容可能应该被规范化为两个、三个或更多表。
  • @wildplasser 我怀疑这是正在清理和规范化的脏数据,但需要手动清理。
  • 确实,正在清理的脏数据。感谢您的帮助。

标签: sql postgresql deduplication


【解决方案1】:

不要使用DISTINCT,而应该GROUP BY 要视为表示重复的字段。

那么你有几个选择:

  • array_agg 未分组的行;

  • GROUP BY ... HAVING count(...) > 1 查询放在您在FROM 子句中使用的子查询中,然后在与您分组的列相同的原始表上自联接。这会让你找到所有有重复的行。

  • row_number() OVER (PARTITION BY col1, col2, col3) as dup_num 使用窗口函数,其中col1, col2, col3 是您当前在DISTINCT 查询中拥有的列。然后将其包装为子查询-in-FROM 并过滤WHERE dup_num > 1。这种方法让您只找到 duplicate 行,即它排除了它视为原始行的一行。要控制哪些被视为重复,哪些被视为原始,您可以在OVER (...) 窗口中使用ORDER BY 子句。

我很确定已经有很多关于如何查找和返回重复项的示例。我建议在 标签下搜索 Stack Overflow 以查找重复项。

【讨论】:

  • 使用 array_agg 被证明是有效的。现在我在每个产品的唯一实例和所有重复实例之间都有了一个映射。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-09
  • 2022-01-12
  • 2015-06-28
  • 1970-01-01
  • 1970-01-01
  • 2013-05-10
  • 2016-09-06
相关资源
最近更新 更多