问题与此find duplicates非常相似 但是我想找到代码不同于'ROME'的重复ID,并且至少有一个名称是'ROME'。
我想得到理想的结果,因为:
1.身份证复制。
2。至少有一个来源是'ROME'
3。该ID的剩余行不是'ROME'
Table
ID ORIGIN
-----------
1 ROME
1 ROME
2 ROME
2 LODI
3 ASTI
4 PISA
4 BARI
Desired Results
ID ORIGIN
-----------
2 ROME
2 LODI
答案 0 :(得分:1)
SELECT
id,
origin
FROM
My_Table T1
WHERE
EXISTS (SELECT * FROM My_Table T2 WHERE T2.id = T1.id AND T2.origin = 'ROME') AND
EXISTS (SELECT * FROM My_Table T3 WHERE T3.id = T1.id AND T3.origin <> 'ROME')
答案 1 :(得分:1)
SELECT t0.id, t0.origin FROM Table t0 WHERE t0.id IN
(SELECT distinct(t1.id) FROM Table t1 JOIN Table t2 ON t1.id = t2.id WHERE t1.id >
(SELECT t2.id FROM Countries t2 WHERE t1.name = t2.name LIMIT 1));
输出
2罗马 2洛迪
这产生了您正在寻找的结果。我不确定它对于不同的数据集是否有任何错误。但这应该让你朝着正确的方向前进。
答案 2 :(得分:1)
SELECT id,
origin
FROM (
SELECT id,
origin,
count(*) over (partition by id) as id_count,
count(case when origin = 'ROME' then origin else null end) over (partition by id) as rome_count,
count(case when origin <> 'ROME' then origin else null end) over (partition by id) as non_rome_count,
row_number() over (partition by id) as rn
FROM stuff
) t
WHERE rome_count > 0
and non_rome_count > 0
and id_count > 1
答案 3 :(得分:0)
CREATE GLOBAL TEMPORARY TABLE Test
(
Id int,
Origin varchar(100)
)
INSERT INTO #Test
SELECT 1, 'ROME' FROM DUAL UNION ALL
SELECT 1, 'ROME' FROM DUAL UNION ALL
SELECT 2, 'ROME' FROM DUAL UNION ALL
SELECT 2, 'LODI' FROM DUAL UNION ALL
SELECT 3, 'ASTI' FROM DUAL UNION ALL
SELECT 4, 'PISA' FROM DUAL UNION ALL
SELECT 4, 'BARI'
SELECT T.Id, T.Origin FROM #Test T
JOIN Test T2 ON T.Id = T2.Id
WHERE T.Origin = 'ROME' AND T2.Origin != 'ROME' OR T.Origin != 'ROME' AND T2.Origin = 'ROME'
有人在评论中询问是否可以更一般地写出来。它不能,否则我们不会得到正确的结果(PISA和BARI会在Table1.Origin!= Table2.Origin上跳过WHERE)