如何按seqnum规则筛选客户主/次地址并修复现有SQL查询错误
需求实现SQL方案
核心逻辑调整思路
- 第一步:按客户ID分组,先对同客户下的所有地址按
seqnum升序排序,对重复的street只保留首次出现(即seqnum最小)的记录,过滤掉后续重复street的地址 - 第二步:对去重后的同客户地址,再次按
seqnum升序打行号 - 第三步:行转列聚合,行号为1的取为
MainAddress,行号为2的取为SecondaryAddress
可运行SQL代码
WITH dedup_address AS ( -- 第一步:同客户同street只保留seqnum最小的记录,过滤重复street SELECT cus_id, seqnum, street, city, -- 给同客户同street的记录打序号,只保留序号=1的 ROW_NUMBER() OVER(PARTITION BY cus_id, street ORDER BY seqnum ASC) AS street_rn FROM Address ), valid_address AS ( -- 第二步:给去重后的同客户地址按seqnum升序打全局序号 SELECT cus_id, seqnum, street, city, ROW_NUMBER() OVER(PARTITION BY cus_id ORDER BY seqnum ASC) AS addr_rn FROM dedup_address WHERE street_rn = 1 -- 只保留每个street首次出现的记录 ) -- 第三步:行转列取主、次地址 SELECT cus_id, MAX(CASE WHEN addr_rn = 1 THEN street END) AS MainAddress, MAX(CASE WHEN addr_rn = 1 THEN city END) AS MainCity, MAX(CASE WHEN addr_rn = 2 THEN street END) AS SecondaryAddress, MAX(CASE WHEN addr_rn = 2 THEN city END) AS SecondaryCity FROM valid_address GROUP BY cus_id
样例数据输出结果
| cus_id | MainAddress | MainCity | SecondaryAddress | SecondaryCity |
|---|---|---|---|---|
| 123 | 2 Main | NYC | NULL | NULL |
| 423 | 7 Wes | Paris | NULL | NULL |
| 512 | 5 Elm | LA | 4 Nav | LA |
原有SQL问题说明
你之前的写法错误点在于固定筛选了seqnum=1作为主地址、seqnum=2作为次地址,没有处理两个场景:
- 部分客户的最小seqnum不是1(比如样例中cus_id=123的最小seqnum是4)
- 同客户下小seqnum的street可能重复,需要跳过重复值取下一个不同的street
内容的提问来源于stack exchange,提问作者Bamba
相关产品推荐
相关产品推荐

