Какой SQL возвращает дубликаты в первом столбце, где значения во втором столбце отличаются? - PullRequest
3 голосов
/ 21 октября 2011

Вопрос очень похож на этот найти дубликаты , но я хотел бы найти только те дубликаты идентификаторов с кодом, отличным от 'ROME', и по крайней мере одно имя 'ROME'.

Я хочу желаемых результатов, потому что:

1. Идентификатор дублируется.2. По крайней мере, один источник "Рим"3. Остальные строки для этого идентификатора НЕ являются «РИМ»

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 

Ответы [ 4 ]

1 голос
/ 21 октября 2011
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
1 голос
/ 21 октября 2011
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 Лоди

Это дало результаты, которые вы ищете.Я не уверен, есть ли какие-либо ошибки для другого набора данных.Но это должно привести вас в правильном направлении.

1 голос
/ 21 октября 2011
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')
0 голосов
/ 21 октября 2011
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 отключили бы WHERE на Table1.Origin! = Table2.Origin)

...