如何查找列中的条目 - 相邻列切换值,然后恢复为原始值?

问题描述 投票:0回答:1

我在一家制帽工厂工作。

我们处理帽子的机器之一称为旋转器。 我们一次批量生产 10,000 顶帽子。 每个批次均由一个数字标识,该数字始终以 1000- 开头,后跟六个自然数。 (例如,1000495867、1000333485 等)

纺纱机上每批次的制造信息均被输入 MySQL 关系数据库。具体来说,进入名为 RS_SPINNER_MACHINESTATUS 的表。该表的工作方式是每分钟记录一次(始终在每分钟的 :00 秒)。因此,一天内您将有 1440 行或条目 – 因为这是一天中的分钟数。

机器并不总是不停运转。事实上,有些日子它根本不运行——但它会继续将行记录到前面提到的表中。 (我们不需要深入了解它 - 但它只是记录这些行以及“No Batch Active”等信息)。

表格如下所示:

批量 BATCH_ACTIVE 运行时间戳
0 2023 年 9 月 1 日 13:04
1000495867 1 2023 年 9 月 1 日 13:05
1000495867 1 2023 年 9 月 1 日 13:06
1000495867 1 2023 年 9 月 1 日 13:07
1000495867 1 2023 年 9 月 1 日 13:08
0 2023 年 9 月 1 日 13:09
1000333485 1 2023 年 9 月 1 日 13:10
1000333485 1 2023 年 9 月 1 日 13:11
0 2023 年 9 月 1 日 13:12

BATCH_ACTIVE 列是二进制的 – 它只能是 0 或 1。

0 表示机器上当前没有运行任何批次(它处于空闲状态)。

1 表示机器上正在运行一个批次。

基于此,您可以通过减去批次的最短时间来推断批次的开始和结束时间。从它的最大。时间戳,其中 BATCH_ACTIVE = 1。

根据我迄今为止对该表的经验,一旦批次开始在计算机上运行,BATCH_ACTIVE 列就会从 0 切换到 1 – 并且保持在 1,直到批次完成 – 此时它会再次恢复为 0。

但是 – 这就是我想用 SQL 检查的内容!

是否可以编写一个 SQL 查询 – 检查 BATCH_ACTIVE 列是否在批次内从 1 切换到 0 – 然后再切换回 1?

例如 – 查询是否可以检测到如下内容:

批次 BATCH_ACTIVE 运行时间戳
0 2023 年 9 月 1 日 13:04
1000495211 1 2023 年 9 月 1 日 13:05
1000495211 1 2023 年 9 月 1 日 13:06
1000495211 0 2023 年 9 月 1 日 13:07
1000495211 1 2023 年 9 月 1 日 13:08
0 2023 年 9 月 1 日 13:09
sql mysql database mysql-workbench relational
1个回答
0
投票

解决这个问题的一种方法是将其表述为间隙和岛屿问题。匹配批次是指具有多个 1 岛的批次。

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY BATCH ORDER BY RUN_TIMESTAMP) rn1,
              ROW_NUMBER() OVER (PARTITION BY BATCH, BATCH_ACTIVE
                                 ORDER BY RUN_TIMESTAMP) rn2
    FROM yourTable
)

SELECT BATCH
FROM cte
WHERE BATCH_ACTIVE = 1
GROUP BY BATCH
HAVING COUNT(DISTINCT rn1 - rn2) > 1;
© www.soinside.com 2019 - 2024. All rights reserved.