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

如何用SQL检测同一Batch内BATCH_ACTIVE值从1切换到0再回到1的记录

检测同一批次内BATCH_ACTIVE状态异常切换的SQL查询

我在一家制帽厂工作,纺纱机的每批生产信息会被录入MySQL数据库,存储在RS_SPINNER_MACHINESTATUS表中。该表每分钟(00秒时)记录一次数据,一天共1440条记录。即使机器完全停机,也会向表中插入内容为"No Batch Active"的记录。

表结构与字段说明

正常表数据示例:

BATCHBATCH_ACTIVERUN_TIMESTAMP
null001-SEP-2023 13:04
1000495867101-SEP-2023 13:05
1000495867101-SEP-2023 13:06
1000495867101-SEP-2023 13:07
1000495867101-SEP-2023 13:08
null001-SEP-2023 13:09
1000333485101-SEP-2023 13:10
1000333485101-SEP-2023 13:11
null001-SEP-2023 13:12

字段含义:

  • BATCH:批次编号,无运行批次时为null
  • BATCH_ACTIVE:二进制类型,仅取0或1
    • 0:机器无批次运行(空闲)
    • 1:机器正在运行对应批次
  • RUN_TIMESTAMP:记录时间戳,精确到分钟

正常情况下,批次启动后BATCH_ACTIVE从0变为1,保持1直到批次结束后变回0。但存在异常情况:同一批次内BATCH_ACTIVE出现从1切换到0再变回1的情况,例如:

BATCHBATCH_ACTIVERUN_TIMESTAMP
null001-SEP-2023 13:04
1000495211101-SEP-2023 13:05
1000495211101-SEP-2023 13:06
1000495211001-SEP-2023 13:07
1000495211101-SEP-2023 13:08
null001-SEP-2023 13:09

解决方案:SQL查询语句

要检测这类异常,可通过窗口函数对比当前记录与前一条记录的状态,找出同一批次内的异常切换:

WITH batch_status_changes AS (
    SELECT
        BATCH,
        RUN_TIMESTAMP,
        BATCH_ACTIVE,
        LAG(BATCH_ACTIVE) OVER (PARTITION BY BATCH ORDER BY RUN_TIMESTAMP) AS prev_active,
        LAG(BATCH) OVER (ORDER BY RUN_TIMESTAMP) AS prev_batch
    FROM RS_SPINNER_MACHINESTATUS
    WHERE BATCH IS NOT NULL
),
abnormal_switches AS (
    SELECT
        BATCH,
        RUN_TIMESTAMP AS switch_to_0_time,
        (SELECT MIN(RUN_TIMESTAMP)
         FROM batch_status_changes bsc2
         WHERE bsc2.BATCH = bsc1.BATCH
           AND bsc2.RUN_TIMESTAMP > bsc1.RUN_TIMESTAMP
           AND bsc2.BATCH_ACTIVE = 1
           AND bsc2.prev_active = 0) AS switch_back_to_1_time
    FROM batch_status_changes bsc1
    WHERE BATCH_ACTIVE = 0
      AND prev_active = 1
      AND prev_batch = BATCH
)
SELECT
    BATCH,
    switch_to_0_time,
    switch_back_to_1_time
FROM abnormal_switches
WHERE switch_back_to_1_time IS NOT NULL;

逻辑说明:

  1. batch_status_changes:用LAG窗口函数获取每条记录的前一条状态和批次号,仅保留有批次的记录。
  2. abnormal_switches:筛选出同一批次内状态从1变为0的记录,并查找该批次后续是否存在从0变回1的时间戳。
  3. 最终查询:返回存在异常切换的批次及对应的切换时间点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 09:00:21