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

如何用SQL的ROW_NUMBER/RANK函数获取状态变更最新行及统计次数

问题解决方案

数据示例

IDDateStatus
1234513/02/23V
1234514/02/23V
1234515/02/238
1234516/02/238
1234517/02/23V
1234518/02/23V
1234519/02/238
1234520/02/238
1234521/02/23U
1234522/02/23U
1234523/02/238
1234524/03/238
6765507/05/23U
6765508/05/23U
6765509/05/238
6765510/05/238
6765511/05/238
6765512/05/23J
6765513/05/23J
6765514/05/238
6765515/05/238
6765516/05/238

需求1:获取每个ID最近一次状态变更为"8"的记录

预期结果

IDDateStatus
1234523/02/238
6765514/05/238

实现SQL

WITH status_groups AS (
    SELECT 
        ID,
        Date,
        Status,
        -- 标记状态变化的位置,生成连续状态组的ID
        -- 注意:若Date为字符串类型,需转换为日期类型确保排序正确
        -- MySQL: STR_TO_DATE(Date, '%d/%m/%y')
        -- PostgreSQL: TO_DATE(Date, 'DD/MM/YY')
        -- SQL Server: CONVERT(DATE, Date, 3)
        SUM(CASE WHEN Status = LAG(Status) OVER (PARTITION BY ID ORDER BY STR_TO_DATE(Date, '%d/%m/%y')) THEN 0 ELSE 1 END) 
            OVER (PARTITION BY ID ORDER BY STR_TO_DATE(Date, '%d/%m/%y')) AS group_id
    FROM your_table
),
status_8_groups AS (
    SELECT 
        ID,
        MIN(Date) AS first_enter_date, -- 每组进入状态"8"的初始日期
        Status,
        ROW_NUMBER() OVER (PARTITION BY ID ORDER BY MIN(STR_TO_DATE(Date, '%d/%m/%y')) DESC) AS rn
    FROM status_groups
    WHERE Status = '8'
    GROUP BY ID, Status, group_id
)
SELECT ID, first_enter_date AS Date, Status
FROM status_8_groups
WHERE rn = 1;

需求2:统计每个ID进入状态"8"的次数

预期结果

IDLoops
123453
676552

实现SQL

WITH status_groups AS (
    SELECT 
        ID,
        Status,
        -- 标记状态变化的位置,生成连续状态组的ID
        -- 注意:若Date为字符串类型,需转换为日期类型确保排序正确
        -- MySQL: STR_TO_DATE(Date, '%d/%m/%y')
        -- PostgreSQL: TO_DATE(Date, 'DD/MM/YY')
        -- SQL Server: CONVERT(DATE, Date, 3)
        SUM(CASE WHEN Status = LAG(Status) OVER (PARTITION BY ID ORDER BY STR_TO_DATE(Date, '%d/%m/%y')) THEN 0 ELSE 1 END) 
            OVER (PARTITION BY ID ORDER BY STR_TO_DATE(Date, '%d/%m/%y')) AS group_id
    FROM your_table
)
SELECT 
    ID,
    COUNT(DISTINCT group_id) AS Loops
FROM status_groups
WHERE Status = '8'
GROUP BY ID;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 18:55:19