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

生成Unique ID以计算各ID对应连续状态的持续时长

解决方案:为连续状态段生成唯一ID并计算总时长

针对同一ID存在多段重复状态的统计问题,核心是通过识别状态变化的分界点为每个连续状态段生成唯一ID,再基于该ID计算分段总时长。以下是具体实现步骤和SQL代码:

核心思路

  1. 按id分组、timestamp排序,用LAG()函数获取上一条记录的status
  2. 对比当前记录与上一条的status,若不同则标记为新分段起点
  3. 对标记值做累计求和,生成每个连续状态段的Unique ID
  4. 按id和Unique ID分组,计算该段的总时长Duration per Status
  5. 将分组统计结果关联回原始数据,得到完整结果表

完整SQL示例

假设你的原始表名为status_logs,已包含id、status、timestamp、end_timestamp、Duration字段:

WITH status_segments AS (
    SELECT
        *,
        -- 标记状态变化的分界点:当前状态与上一行不同则为1,否则为0
        CASE 
            WHEN LAG(status) OVER (PARTITION BY id ORDER BY timestamp) != status 
            THEN 1 
            ELSE 0 
        END AS segment_start,
        -- 累计求和生成Unique ID
        SUM(
            CASE 
                WHEN LAG(status) OVER (PARTITION BY id ORDER BY timestamp) != status 
                THEN 1 
                ELSE 0 
            END
        ) OVER (PARTITION BY id ORDER BY timestamp ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) + 1 AS unique_id
    FROM status_logs
),
segment_duration AS (
    SELECT
        unique_id,
        SUM(Duration) AS duration_per_status
    FROM status_segments
    GROUP BY unique_id
)
SELECT
    s.id,
    s.status,
    s.timestamp,
    s.end_timestamp,
    s.Duration,
    s.unique_id,
    sd.duration_per_status
FROM status_segments s
JOIN segment_duration sd ON s.unique_id = sd.unique_id
ORDER BY s.id, s.timestamp;

关键函数解释

  • LAG(status) OVER (PARTITION BY id ORDER BY timestamp):获取同一ID下上一条记录的状态,用于判断是否进入新的连续段
  • SUM(...) OVER (PARTITION BY id ORDER BY timestamp ...):对状态变化标记做累计求和,生成唯一的分段ID
  • SUM(Duration) GROUP BY unique_id:计算每个连续状态段的总时长

最终结果表

idstatustimestampend_timestampDurationUnique IDDuration per Status
1available10/02/2023 10:20:4510/02/2023 10:25:4500:05:0010:15:00
1available10/02/2023 10:25:4510/02/2023 10:30:4500:05:0010:15:00
1available10/02/2023 10:30:4510/02/2023 10:35:4500:05:0010:15:00
1unavailable10/02/2023 10:35:4510/02/2023 10:40:4500:05:0020:20:00
1unavailable10/02/2023 10:40:4510/02/2023 10:45:4500:05:0020:20:00
1unavailable10/02/2023 10:45:4510/02/2023 10:50:4500:05:0020:20:00
1unavailable10/02/2023 10:50:4510/02/2023 10:55:4500:05:0020:20:00
1waiting10/02/2023 10:55:4510/02/2023 11:00:4500:05:0030:10:00
1waiting10/02/2023 11:00:4510/02/2023 11:05:4500:05:0030:10:00
1available10/02/2023 11:05:4510/02/2023 11:10:4500:05:0040:15:00
1available10/02/2023 11:10:4510/02/2023 11:15:4500:05:0040:15:00
1available10/02/2023 11:15:4510/02/2023 11:20:4500:05:0040:15:00
2unavailable10/02/2023 10:20:4510/02/2023 10:25:4500:05:0050:15:00
2unavailable10/02/2023 10:25:4510/02/2023 10:30:4500:05:0050:15:00
2unavailable10/02/2023 10:30:4510/02/2023 10:35:4500:05:0050:15:00
2waiting10/02/2023 10:35:4510/02/2023 10:40:4500:05:0060:10:00
2waiting10/02/2023 10:40:4510/02/2023 10:45:4500:05:0060:10:00
2unavailable10/02/2023 10:45:4510/02/2023 10:50:4500:05:0070:05:00
1available11/02/2023 08:30:4511/02/2023 08:35:4500:05:0080:10:00
1available11/02/2023 08:35:4511/02/2023 08:40:4500:05:0080:10:00
1waiting11/02/2023 08:40:4511/02/2023 08:45:4500:05:0090:05:00
1available11/02/2023 08:45:4511/02/2023 08:50:4500:05:00100:05:00

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 14:25:48