sql - 如何选择具有重复字段值的每一行

标签 sql postgresql duplicates

使用 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/

相关文章:

sql - 如何对两个不相关的表进行求和?

sql - 插入和返回新记录或现有记录的 ID,在 Postgres 12.5 中需要更好的策略

java - 如何保持@ManyToMany 关系 - 重复条目或分离实体

sql - 如何在 Postgres 中使用 upsert

sql - 架构比较 Visual Studio 2012

mysql - 创建数据库时 mysql 与 netbeans 的连接出错?

c# - $orderBy 在 odata v4 中具有重复属性

sql - 如何使用 postgres dblink 更新另一个数据库中的表?

javascript - 从 Sails.js 中的关联模型访问模型的属性

iphone - 删除 nsarray 中的重复项