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

如何从数据库列中提取电机运行时段的起始与结束时间?

解决方案:提取电机运行时段的关键节点

你的需求是获取电机运行时段的起始点(首个Start,或Stop/Standby之后的第一个Start)和结束点(Stop/Standby之前的最后一个Start),可以通过SQL窗口函数LAG()和LEAD()实现,这两个函数能帮我们判断状态切换的节点。

方法1:直接筛选关键Start记录

先给每条记录标记上一条、下一条的状态,再筛选出符合条件的Start:

WITH status_with_neighbors AS (
    SELECT 
        DateTime,
        MotorStatus,
        -- 获取当前记录的上一条状态
        LAG(MotorStatus) OVER (ORDER BY DateTime) AS prev_status,
        -- 获取当前记录的下一条状态
        LEAD(MotorStatus) OVER (ORDER BY DateTime) AS next_status
    FROM TableName
)
SELECT DateTime, MotorStatus
FROM status_with_neighbors
WHERE MotorStatus = 'Start'
AND (
    -- 匹配首个Start(无前置记录,或前置状态非Start)
    prev_status IS NULL
    OR prev_status IN ('Stop', 'Standby')
    -- 匹配运行时段的结束Start(后置状态为Stop/Standby)
    OR next_status IN ('Stop', 'Standby')
)
ORDER BY DateTime;

方法2:直接输出完整运行时段(起始+结束时间配对)

如果需要直接得到每个运行时段的起止时间,可以通过分组标记实现:

WITH status_groups AS (
    SELECT 
        DateTime,
        MotorStatus,
        -- 给每个连续的Start时段打分组标记:每次从非Start切换到Start时,分组号+1
        SUM(
            CASE 
                WHEN LAG(MotorStatus) OVER (ORDER BY DateTime) IN ('Stop', 'Standby') 
                     OR LAG(MotorStatus) OVER (ORDER BY DateTime) IS NULL 
                THEN 1 
                ELSE 0 
            END
        ) OVER (ORDER BY DateTime ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS run_group
    FROM TableName
    WHERE MotorStatus = 'Start'
)
SELECT 
    MIN(DateTime) AS 运行开始时间,
    MAX(DateTime) AS 运行结束时间
FROM status_groups
GROUP BY run_group
ORDER BY 运行开始时间;

注意事项

  • 确保DateTime字段是可排序的日期类型,否则排序逻辑会出错
  • 如果数据库对大小写敏感,要保证MotorStatus的匹配值和数据一致(比如数据里是Start就不要写START)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 10:33:20