sql - 删除不同列中的重复行
问题描述
表格1:
id name address1 address2 address3
------------------------------------------
1 Jenny A B NULL
2 John C NULL NULL
3 Jenny B A NULL
4 John NULL NULL C
......
id1
并且id3
在这种情况下是相同的,id2
并且id4
也是相同的。
我可以删除id3
和id4
吗?我正在使用 SQL Server 2019。
解决方案
如果您使用的是 SQL Server 2017 或更高版本,则可以使用STRING_AGG
;根据名称和每个地址字段为每一行构建一个唯一标识符。然后找到该值每次出现的行号(按 排序id
),然后您可以删除行号 > 1 的行:
WITH CTE AS (
SELECT id, name AS value
FROM data
UNION ALL
SELECT id, address1
FROM data
UNION ALL
SELECT id, address2
FROM data
UNION ALL
SELECT id, address3
FROM data
),
CTE2 AS (
SELECT id, STRING_AGG(value, '%') WITHIN GROUP (ORDER BY value) AS v
FROM CTE
GROUP BY id
),
CTE3 AS (
SELECT id, v,
ROW_NUMBER() OVER (PARTITION BY v ORDER BY id) AS rn
FROM CTE2
)
DELETE d
FROM data d
JOIN CTE3 ON CTE3.id = d.id
WHERE CTE3.rn > 1
推荐阅读
- java - 如何修复 UnsatisfiedLinkError?
- angular - 将 sessionStorage 中的数据保存为角度未定义
- mysql - 在 SQL 中使用多列在 GROUP BY 中返回 0 个计数
- java - 2D JRadioButton 对象数组
- r - 横杆未按顺序排列
- db2 - DB2 选择组匹配条件,然后进行聚合 listagg
- python - python中的正则表达式-如何理解这个不带括号的ip标签
- elasticsearch - 将 Elastic 搜索数据从 5.6.4 迁移到 6.6.0
- ios - Xamarin 表单:ios 应用程序启动屏幕中的应用程序徽标在 ipad 上未居中对齐
- android-studio - Android Studio 中的 SearchView 自动完成功能