PostgreSQL如何筛选出用户名至少变更过一次的账户ID
解决SQL查询用户名变更账户的问题
核心原理
你之前GROUP BY查询未生效,大概率是没有对用户名去重统计:如果直接统计每个账户的总记录数,会因为同一用户名下多次更新其他字段产生的重复行,导致所有账户都满足COUNT(*) >1的条件,不符合需求。
需求的判断逻辑和多账户跨时间复用用户名的场景无关,只需要判断**同一个账户(b列)是否存在至少2个不同的用户名(c列)**即可。
最简实现SQL
SELECT b FROM accounthistory GROUP BY b HAVING COUNT(DISTINCT c) > 1;
逻辑说明
- 按账户外键
b分组聚合所有历史记录 COUNT(DISTINCT c)统计每个账户下出现过的不重复用户名数量,自动忽略同一用户名下多次更新其他字段产生的重复行HAVING子句筛选出用户名数量大于1的账户,就是你需要的发生过用户名变更的账户列表
可选适配方案
场景1:排除删除操作记录
如果不需要纳入DELETE操作的用户名记录,可增加过滤条件:
SELECT b FROM accounthistory WHERE e != 'DELETE' GROUP BY b HAVING COUNT(DISTINCT c) > 1;
场景2:兼容不支持COUNT(DISTINCT)的旧版数据库
可以先对账户+用户名的组合去重,再统计数量,效果和上述写法完全一致:
SELECT b FROM ( SELECT DISTINCT b, c FROM accounthistory ) AS account_user_map GROUP BY b HAVING COUNT(*) > 1;
内容的提问来源于stack exchange,提问作者Asikto
相关产品推荐
相关产品推荐

