如何从数据库列中提取电机运行时段的起始与结束时间?
解决方案:提取电机运行时段的关键节点
你的需求是获取电机运行时段的起始点(首个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
相关产品推荐
相关产品推荐

