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

如何用SQL查询获取客户的上一状态(表中第二新条目)

没问题,我来帮你搞定这个获取客户上一状态的SQL需求!

需求分析

从你的示例数据能看出来,每个客户的状态是按时间顺序递进的,当前活跃的状态(Active='Y')是最后一条记录,我们要找的就是这条活跃状态的上一个状态及其对应的结束日期。

解决方案:用窗口函数LAG()实现

窗口函数是处理这类“前后行关联”需求最简洁的方式,直接看代码:

假设你的表名叫customer_status,执行下面的查询就能得到期望结果:

WITH customer_status_with_prev AS (
    SELECT 
        Customer_id,
        status,
        end_date,
        Active,
        -- 按客户分组,按状态开始时间升序,获取上一个状态
        LAG(status) OVER (PARTITION BY Customer_id ORDER BY start_date ASC) AS Previous_status,
        -- 同时获取上一个状态的结束日期
        LAG(end_date) OVER (PARTITION BY Customer_id ORDER BY start_date ASC) AS prev_end_date
    FROM customer_status
)
SELECT 
    Customer_id,
    Previous_status,
    prev_end_date AS end_date
FROM customer_status_with_prev
WHERE Active = 'Y'; -- 只筛选当前活跃的记录,取出它对应的上一状态

代码解释

  1. CTE部分:用LAG()窗口函数,按Customer_id分组,按start_date从小到大排序,这样每个记录都能拿到它的上一条记录的status和end_date。
  2. 主查询:筛选出Active='Y'的记录,这时候它的Previous_status就是我们要的上一状态,prev_end_date就是对应结束日期。

针对示例数据的验证

对Customer_id=1的记录,按start_date排序后,活跃状态(Globalist)的上一条就是Explorist,对应的end_date是30-APR-18,完全匹配你想要的输出结果。

额外说明

如果你的数据里存在一个客户有多条Active='Y'的记录(虽然示例里没有这种情况),可以再加一层排序确保取到最新的活跃状态:

WITH ranked_status AS (
    SELECT 
        Customer_id,
        status,
        end_date,
        Active,
        LAG(status) OVER (PARTITION BY Customer_id ORDER BY start_date ASC) AS Previous_status,
        LAG(end_date) OVER (PARTITION BY Customer_id ORDER BY start_date ASC) AS prev_end_date,
        -- 按start_date降序排名,最新的记录排第1
        ROW_NUMBER() OVER (PARTITION BY Customer_id ORDER BY start_date DESC) AS rn
    FROM customer_status
)
SELECT 
    Customer_id,
    Previous_status,
    prev_end_date AS end_date
FROM ranked_status
WHERE Active = 'Y' AND rn = 1;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:22:41