【问题标题】:Postgresql-Finding duplicate lines detailsPostgresql-查找重复行详细信息
【发布时间】:2021-06-01 20:49:48
【问题描述】:

以下查询返回一些行:

SELECT   COUNT(*) AS Dup, virtual_switch_id, slot_number, port_number
FROM     switch_port
GROUP BY virtual_switch_id, slot_number, port_number
HAVING   COUNT(*) > 1

dup virtual_switch_id   slot_number port_number
2   47                  0           5
2   46                  0           5
2   26                  1           22
2   46                  0           2

这正是我最初想要的,但我需要了解更多信息。 是否可以有其他值(不属于重复项)?

每个重复行(测试了 3 个字段)在 switch_port 表(和其他有趣的字段)中都有一个唯一的 id(主键),每个 virtual_switch_id 在另一个表中都有一个名称,称为 switch_conf。

所以我想要一些这样的结果(仅在我的前三个字段重复的地方):

virtual_switch_id   slot_number port_number id  value1 switch_conf.name
47                  0           5           0   val1   sw1 
47                  0           5           1   val2   sw1
26                  1           22          2   val1   sw2
26                  1           22          8   val4   sw2
26                  1           22          12  val1   sw2         

为了选择我必须删除的重复条目。

尝试了一些“加入”但没有结果(笛卡尔积代替......)。我认为 GROUP BY 不是正确的解决方案...

感谢任何线索/答案。

【问题讨论】:

  • 我理解正确吗:你只是想删除你的重复记录?
  • 我只想保留一个记录,手动删除重复,有一些值的时候发现...
  • 请添加一些示例数据到您的问题,并更详细地解释您的预期输出。在那种情况下,我不明白你想要检索
  • 我想要像最初问题中提供的第二个输出一样。有了这个输出,我可以选择我必须删除的“id”(例如:重复行 47,0,5 的“1”,因为“value1”字段的值对我来说不正确)。
  • 我只想在具有前 3 个字段的相同值的重复行时输出。否则,我有成千上万的结果(与人脑不兼容!)

标签: postgresql duplicates


【解决方案1】:

您可以使用COUNT() window function,它将带有行数的列添加到组(= 分区)的每个元素。之后,您可以选择所有行数 >= 2 的记录:

    SELECT
        *
    FROM (
        SELECT
            *,
            COUNT(*) OVER (PARTITION BY virtual_switch_id, slot_number, port_number)
        FROM switch_port
    ) s
    WHERE count >= 2

【讨论】:

  • 不,我想要更多信息来选择我删除的行(必须在手动删除之前调查)。
  • 无法按预期工作:在重复项中仅输出一行,我希望两者都选择要删除的行。
  • 将 row_number 更改为计数。现在应该显示所有具有重复项的组。
  • 刚刚添加了一些字段和表格来收集更多信息(使用 WHERE 子句完成加入)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-02
  • 2013-10-10
  • 1970-01-01
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多