选择第1列值相同但PostgreSQL中第2列值不同的行

时间:2016-08-22 14:15:57

标签: sql postgresql

我正在使用这种结构的桌子上使用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

但这给了我奇怪的结果,包括一个项目只有一个人的行,反之亦然。

有人可以帮我解决这个小问题吗?

非常感谢!

2 个答案:

答案 0 :(得分:1)

这是一个选项,使用子查询获取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相关联的名称。< / p>

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

答案 1 :(得分:0)

我认为这里的关键是计数(Distinct person)&gt; 1

Select project, person 
from table 
group by project 
having count(distinct person) >1