首页 > 解决方案 > Postgresql-查找重复行详细信息

问题描述

以下查询返回我一些行:

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 不是正确的解决方案......

任何线索/答案表示赞赏。

标签: postgresqlduplicates

解决方案


您可以使用COUNT()窗口函数,它向组的每个元素(= 分区)添加具有行数的列。之后,您可以选择行数 >= 2 的所有记录:

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

推荐阅读