You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于条件拆分行数据:提取父子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,都会得到你想要的输出:

IDParent_Cust_idChild_Cust_id
6037540701479807014
6047540701679807016
6057540701879807018
6067540702079807020

注意:把your_table_name替换成你实际的表名即可。

内容的提问来源于stack exchange,提问作者Hadrian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:01:37