2015-12-10 2 views
0

Мне нужно определить студентов (student_id) с уникальным person_id и вернуть еще один столбец с 0, если он не уникален, с 1 при уникальности.SQL Query optimization - определение уникальных значений

Вот что у меня есть:

Select 
    student_id, 0 
FROM 
    PERSON 
WHERE 
    PERSON.person_id in ( 
     SELECT PERSON.person_id 
     FROM PERSON 
     WHERE PERSON.person_id<>'' 
     GROUP BY PERSON.person_id 
     HAVING COUNT(*)>1 
    ) 
UNION 
Select 
    student_id, 1 
FROM 
    PERSON 
WHERE 
    PERSON.person_id not in (
     SELECT PERSON.person_id 
     FROM PERSON 
     WHERE PERSON.person_id<>'' 
     GROUP BY PERSON.person_id 
     HAVING COUNT(*)>1 
    ) 

Образец данных: http://pastebin.com/EcqQU88J MS SQL Server

Есть ли более эффективный способ сделать эту работу?

+1

'ВЫБОР student_id, случай, когда СЧЕТ (DISTINCT person_id) = 1 ТОГДА 1 0 КОНЕЦ ИНАЧЕ ОТ #PERSON GROUP BY student_id' [демо] (https: // данных. stackexchange.com/stackoverflow/query/406875) – lad2025

+0

@ lad2025 Он возвращает только «1» во второй колонке. –

+0

Итак? Это означает, что в ваших данных для каждого студенческого идентификатора это только уникальный person_id. Покажите пример (для данных, которые вы предоставили), когда он должен вернуться 0 – lad2025

ответ

2

Вы можете использовать:

WITH cte AS 
(
    SELECT person_id, COUNT(DISTINCT student_id) AS r 
    FROM #PERSON 
    GROUP BY person_id 
) 
SELECT student_id, CASE WHEN r = 1 THEN 0 ELSE 1 END 
FROM #PERSON p 
JOIN cte c 
    ON p.person_id = c.person_id 
-- ORDER BY student_id 

Вы должны добавить индексы к вашей PERSON таблице.

LiveDemo

+0

Отлично! Это нормально. Спасибо :) –

3

Что-то вроде этого может быть более эффективным. Я думаю, что это проще.

select student_id 
, case when personIds = 1 then 0 else 1 end notUnique 
from 
(select student_id 
, count(distinct person_id) personIDs 
from person 
where person_id <> '' 
group by student_id 
) temp 
+2

Он возвращает только «0» во втором столбце. –