如何用SQL查询仅拥有1个CA账户和1个SA账户的LINK_USER_ID
筛选仅拥有1个CA账户和1个SA账户的LINK_USER_ID的SQL查询
需求说明
- 目标:编写SQL查询,筛选出仅拥有1个CA账户和1个SA账户的
LINK_USER_ID - 排除对象:
- 拥有2个CA账户+1个SA账户的用户
- 仅拥有1个CA账户的用户
- 仅拥有1个SA账户的用户
- 存在CA、SA以外其他账户类型(如MC)的用户
- 注意:单个
LINK_USER_ID可关联多个LINK_CIS_NO
样本数据
| LINK_ODDS_NO | LINK_ACCT_NO | LINK_USER_ID | LINK_CIS_NO | LINK_ACCT_TYPE |
|---|---|---|---|---|
| 124770648 | 3180879599940 | 99134982 | 3236463 | CA |
| 124770649 | 3180879599941 | 99134982 | 3236464 | SA |
| 124770650 | 3180879599942 | 99134981 | 3236465 | CA |
| 124770651 | 3180879599943 | 99134981 | 3236466 | SA |
| 124770652 | 3180879599944 | 99134984 | 3236455 | MC |
| 124770653 | 3180879599945 | 99134984 | 3236478 | CA |
| 124770654 | 3180879599946 | 99134985 | 32364688 | CA |
| 124770655 | 3180879599947 | 99134985 | 3236556 | SA |
| 124770656 | 3180879599948 | 99134986 | 3244879 | SA |
预期结果
| LINK_USER_ID |
|---|
| 99134982 |
SQL查询方案
方案一:基础统计版
适用于无重复账户记录的场景,直接统计账户类型的出现次数:
SELECT LINK_USER_ID FROM your_table_name GROUP BY LINK_USER_ID HAVING SUM(CASE WHEN LINK_ACCT_TYPE = 'CA' THEN 1 ELSE 0 END) = 1 AND SUM(CASE WHEN LINK_ACCT_TYPE = 'SA' THEN 1 ELSE 0 END) = 1 AND SUM(CASE WHEN LINK_ACCT_TYPE NOT IN ('CA', 'SA') THEN 1 ELSE 0 END) = 0;
方案二:去重账户版
如果存在同一账户重复记录的情况,用DISTINCT LINK_ACCT_NO确保统计的是不同账户:
SELECT LINK_USER_ID FROM your_table_name GROUP BY LINK_USER_ID HAVING COUNT(DISTINCT CASE WHEN LINK_ACCT_TYPE = 'CA' THEN LINK_ACCT_NO END) = 1 AND COUNT(DISTINCT CASE WHEN LINK_ACCT_TYPE = 'SA' THEN LINK_ACCT_NO END) = 1 AND COUNT(DISTINCT CASE WHEN LINK_ACCT_TYPE NOT IN ('CA', 'SA') THEN LINK_ACCT_NO END) = 0;
说明
- 替换
your_table_name为实际表名 - 两个方案的核心逻辑一致:同时满足CA账户数=1、SA账户数=1、无其他类型账户三个条件
内容的提问来源于stack exchange,提问作者INeXoNI
相关产品推荐
相关产品推荐

