2016-08-22 2 views
0

Я работаю на PostgreSQL на столе с этой структурой:Выберите строки, где столбец 1 значение совпадает, но значение столбца 2 отличается в PostgreSQL

________________ 
|project|person| 
|_______|______| 
|1  |P1 | 
|1  |P2 | 
|2  |P3 | 
|2  |P3 | 
|3  |P4 | 
|_______|______| 

Я хотел бы написать запрос SQL для выбора ТОЛЬКО строки, в которых один проект имеет более одного человека. Другими словами, я хотел бы выбрать все строки, где проект один и тот же, но человек отличается, за исключением других строк. В моем примере он вернул бы только два первых ряда:

________________ 
|project|person| 
|_______|______| 
|1  |P1 | 
|1  |P2 | 
|_______|______| 

Я не могу обернуть свою голову вокруг этого. Я видел this question, который в основном противоположный, но я не вижу, как заставить его работать для меня.

Я пытался возиться с COUNT или HAVING в течение длительного времени, но я не могу понять логику того, как я должен построить этот запрос. Например, я попробовал:

SELECT t.person, t.project 
FROM table t 
GROUP BY r.ide_proj, r.ide_pers 
HAVING COUNT(t.person) > 1 

, но это дает мне странные результаты, в том числе строк whre одного проекта есть только один человек, или наоборот.

Может ли кто-нибудь помочь мне с этой маленькой проблемой?

Большое спасибо!

+0

Вы не можете добавить ожидаемый результат? И покажите нам свою текущую попытку запроса! – jarlh

+0

вы попробовали что-то вроде этого: 'select * from YOURTABLE со счетом (person)> 1'? – AlainIb

+0

@Alainlb 'count (Distinct person)> 1 проект 2 имел p3 два раза. – xQbert

ответ

0

Вот один вариант с использованием подзапроса, чтобы получить distinct строки, а затем window function, чтобы получить как project и person.

select * 
from (
    select *, count(person) over (partition by project) cnt 
    from (select distinct project, person from yourtable) t 
    ) t 
where cnt > 1 

Или вы можете использовать обычный group by запрос, но вы должны будете join результат обратно к исходной таблице, чтобы получить имена, связанные с каждым project.

select t.* 
from yourtable t join (
    select project 
    from yourtable 
    group by project 
    having count(distinct person) > 1) t2 on t.project = t2.project 
+0

Работает как шарм, спасибо! :) Я продолжу работу над этими запросами, чтобы убедиться, что я их понимаю. Спасибо всем, кто ответил тоже. –

0

Я думаю, что ключевым здесь является счетчиком (Distinct человек)> 1

Select project, person 
from table 
group by project 
having count(distinct person) >1 
Смежные вопросы