2016-08-22 36 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 have count(person)> 1'? – AlainIb

+0

@Alainlb' count(獨特的人)> 1'項目2有p3兩次。 – xQbert

回答

0

下面是一個使用子查詢,以獲得distinct行一個選項,然後一個window function拿到兩個projectperson

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

我認爲,這裏的關鍵是計數(不同人)> 1

Select project, person 
from table 
group by project 
having count(distinct person) >1 
相關問題