基于条件拆分行数据:提取父子ID并排除单行记录
解决方案:提取父/子Cust_id并排除单行ID
咱们先明确你的核心需求:
- 按
ID分组,排除只有单行记录的ID(比如608) - 同一
ID下,将日期更早的Cust_id标记为父ID,日期更晚的标记为子ID
你已经用到了ROW_NUMBER()窗口函数,这思路很对,咱们在此基础上完善即可,下面给你两种常用的实现方案:
方案1:条件聚合(推荐,更简洁)
这种方法通过窗口函数先过滤掉单行ID,再用条件聚合直接把父子ID放到同一行:
WITH ranked_data AS ( SELECT Cust_id, ID, Date, -- 按ID分组,按日期升序给每条记录编号(1=父,2=子) ROW_NUMBER() OVER(PARTITION BY ID ORDER BY Date ASC) AS rn, -- 统计每个ID的总记录数,用于过滤单行ID COUNT(*) OVER(PARTITION BY ID) AS id_count FROM your_table_name ) SELECT ID, -- 取rn=1的Cust_id作为父ID MAX(CASE WHEN rn = 1 THEN Cust_id END) AS Parent_Cust_id, -- 取rn=2的Cust_id作为子ID MAX(CASE WHEN rn = 2 THEN Cust_id END) AS Child_Cust_id FROM ranked_data -- 只保留有至少2条记录的ID WHERE id_count >= 2 GROUP BY ID ORDER BY ID;
方案2:自连接(适合更复杂的关联场景)
如果需要更灵活的关联逻辑,可以用自连接实现:
WITH filtered_ranked_data AS ( SELECT Cust_id, ID, Date, ROW_NUMBER() OVER(PARTITION BY ID ORDER BY Date ASC) AS rn FROM your_table_name -- 先过滤掉单行ID(子查询统计每个ID的记录数) WHERE ID IN ( SELECT ID FROM your_table_name GROUP BY ID HAVING COUNT(*) >= 2 ) ) SELECT p.ID, p.Cust_id AS Parent_Cust_id, c.Cust_id AS Child_Cust_id FROM filtered_ranked_data p JOIN filtered_ranked_data c ON p.ID = c.ID AND p.rn = 1 AND c.rn = 2 ORDER BY p.ID;
结果说明
运行以上任意一种SQL,都会得到你想要的输出:
| ID | Parent_Cust_id | Child_Cust_id |
|---|---|---|
| 603 | 75407014 | 79807014 |
| 604 | 75407016 | 79807016 |
| 605 | 75407018 | 79807018 |
| 606 | 75407020 | 79807020 |
注意:把
your_table_name替换成你实际的表名即可。
内容的提问来源于stack exchange,提问作者Hadrian
相关产品推荐
相关产品推荐

