使用 PostgreSQL,我试图找到一种方法来选择每一 行,这些行与特定列的值重复。
例如,我的表格看起来像这样:
id | username | email
1 | abc | abc@test.com
2 | abc1 | abc@test.com
3 | def | def@test.com
4 | ghi | ghi@test.com
5 | ghi1 | ghi@test.com
我想要的输出将选择用户名和电子邮件,其中电子邮件计数 > 2:
abc | abc@test.com
abc1 | abc@test.com
ghi | ghi@test.com
ghi1 | ghi@test.com
我已经尝试过 group by having
,这让我接近我想要的,但我不认为我想使用 group by
因为那实际上会将具有重复值的行组合起来,我仍然想显示包含重复值的单独行。
SELECT email FROM auth_user
GROUP BY email HAVING count(*) > 1;
这只会向我显示具有重复值的电子邮件:
abc@test.com
ghi@test.com
我可以使用 SELECT email, count(*) FROM ...
将计数包含在内,但这也不是我想要的。
我想我想要类似 where count(email) > 1
的东西,但这给了我一个错误,提示 ERROR: aggregate functions are not allowed in WHERE
如何在不对重复值进行分组的情况下选择重复值?
用解决方案更新:
@GordonLinoff 发布了正确答案。但是为了满足我只获取用户名和电子邮件字段的确切需求,我修改了他的一点点(这应该是不言自明的,但张贴以防其他人需要确切的查询)
select username, email
from (select username, email, count(*)
over (partition by email) as cnt
from auth_user au
) au
where cnt > 1;
最佳答案
如果您想要所有原始行,那么我建议使用 count(*)
作为窗口函数:
select au.*
from (select au.*, count(*) over (partition by email) as cnt
from auth_user au
) au
where cnt > 1;
关于sql - 如何选择具有重复字段值的每一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43474344/