postgresql - 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 不是正确的解决方案......
任何线索/答案表示赞赏。
解决方案
您可以使用COUNT()
窗口函数,它向组的每个元素(= 分区)添加具有行数的列。之后,您可以选择行数 >= 2 的所有记录:
SELECT
*
FROM (
SELECT
*,
COUNT(*) OVER (PARTITION BY virtual_switch_id, slot_number, port_number)
FROM switch_port
) s
WHERE count >= 2
推荐阅读
- c# - C# 调用 web 服务,没有像 php 中的类“SoapClient”这样的引用
- java - java中的客户端服务器不工作,使用什么端口号?
- javascript - 创建条形图时缺少第一个值
- c - strcmp 对一个字符串正常工作,对于另一个相同的字符串总是返回正数
- jquery - 使用 {% for %} 将活动类添加到当前滑块
- perl - 将多个值传递给命令行参数并将其存储为数组
- javascript - 如何使用 NodeJs 通过 Html 页面将数据插入表中
- mysql - 使用 INSERT ... SELECT 防止锁定等待超时
- c++ - 当打印作业通过驱动程序时,如何触发打开应用程序?[C++] [WDK]
- python - Anaconda 和 jupyter notebooks:如何切换使用的虚拟环境?