我正在使用这种结构的桌子上使用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
但这给了我奇怪的结果,包括一个项目只有一个人的行,反之亦然。
有人可以帮我解决这个小问题吗?
非常感谢!
答案 0 :(得分:1)
这是一个选项,使用子查询获取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
相关联的名称。< / 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