求正确SQL查询:找出对应双指标存在多值的账号
找出存在多组指标的账号
你的需求是筛选出Accounts表中,同一个acct_nbr对应多个不同的(Acct_Indicator1, Acct_Indicator2)组合的账号及对应指标值。原查询仅做了分组排序,没有完成筛选逻辑,以下是两种正确的实现方式:
方法一:先筛选账号再关联(兼容多数数据库)
SELECT a.acct_nbr, a.Acct_Indicator1, a.Acct_Indicator2 FROM Accounts a INNER JOIN ( -- 统计每个账号的唯一指标组合数,筛选出组合数>1的账号 SELECT acct_nbr FROM Accounts GROUP BY acct_nbr -- 用分隔符拼接两个指标,确保不同组合被正确计数;若指标含|可换其他分隔符 HAVING COUNT(DISTINCT CONCAT(Acct_Indicator1, '|', Acct_Indicator2)) > 1 ) b ON a.acct_nbr = b.acct_nbr ORDER BY a.acct_nbr;
方法二:使用窗口函数(适用于支持窗口函数的数据库,如MySQL 8+、PostgreSQL、SQL Server)
SELECT acct_nbr, Acct_Indicator1, Acct_Indicator2 FROM ( SELECT acct_nbr, Acct_Indicator1, Acct_Indicator2, -- 按账号分组,统计该账号下的唯一指标组合数 COUNT(DISTINCT CONCAT(Acct_Indicator1, '|', Acct_Indicator2)) OVER (PARTITION BY acct_nbr) AS combo_count FROM Accounts ) t -- 筛选出组合数>1的记录 WHERE combo_count > 1 ORDER BY acct_nbr;
简化写法(仅PostgreSQL支持)
PostgreSQL允许直接对多列使用DISTINCT COUNT,无需拼接:
SELECT a.acct_nbr, a.Acct_Indicator1, a.Acct_Indicator2 FROM Accounts a INNER JOIN ( SELECT acct_nbr FROM Accounts GROUP BY acct_nbr HAVING COUNT(DISTINCT (Acct_Indicator1, Acct_Indicator2)) > 1 ) b ON a.acct_nbr = b.acct_nbr ORDER BY a.acct_nbr;
内容的提问来源于stack exchange,提问作者Amrit
相关产品推荐
相关产品推荐

