我正在尝试创建一个基于多个规则删除重复项的查询。
一些示例数据:
A栏:B栏:
One Apple
One Pear
Two Apple
Two Mango
Three Pear
Four Mango
Five Plum
Six Mango
Zero Banana
基本上我一直在争论的是,我希望查询根据每列的重复项返回不同的对。这意味着如果A中存在重复,则根据列重复删除所有条目(例如,两个和两个将删除两个苹果,两个芒果)。 B的相同逻辑(例如苹果苹果和芒果芒果被取出)所以最终结果将是:
A栏:B栏:
Three Pear
Zero Banana
Five Plum
任何指针都会很棒。我在SQL Server上。谢谢。
答案 0 :(得分:0)
您可以重新加入桌面,然后选择没有匹配项的行(例如没有重复项)。
SELECT a, b
FROM my_table source
LEFT JOIN my_table a_dups
ON source.a = a_dups.a
AND source.b <> a_dups.b
LEFT JOIN my_table b_dups
ON source.b = b_dups.b
AND source.a <> b_dups.a
WHERE a_dups.a IS NULL
AND b_dups.b IS NULL
键入这个外部IDE以赦免SQL错误,但希望能给你一个想法。
答案 1 :(得分:0)
这就是:
创建样本数据集:
cols
显示完整数据集:
CREATE TABLE #temp (ColumnA varchar(20), ColumnB varchar(20))
INSERT INTO #temp
VALUES('One','Apple'),
('One','Pear'),
('Two','Apple'),
('Two','Mango'),
('Three','Pear'),
('Four','Mango'),
('Five','Plum'),
('Six','Mango'),
('Zero','Banana');
使用带有patrition的Common Table表达式来识别两列中的重复项:
SELECT * FROM #temp;
显示以下结果:
WITH CTE AS (SELECT *,ROW_NUMBER() OVER (PARTITION BY ColumnA ORDER BY ColumnA ) AS rn1, ROW_NUMBER() OVER (PARTITION BY ColumnB ORDER BY ColumnB ) AS rn2 FROM #temp)
SELECT * FROM CTE WHERE ColumnA NOT IN (SELECT ColumnA FROM CTE WHERE rn1 <> 1) AND ColumnB NOT IN (SELECT ColumnB FROM CTE WHERE rn2 <> 1)
答案 2 :(得分:0)
您可以使用窗口函数来获取每个字段的计数,然后只检查两者的计数是否为1。像这样:
SELECT ColumnA, ColumnB
FROM (
SELECT ColumnA, ColumnB,
COUNT(*) OVER (PARTITION BY ColumnA) as ACount,
COUNT(*) OVER (PARTITION BY ColumnB) as BCount
FROM TABLE
) X
WHERE ACount = 1 AND BCount = 1