MySQL:检查子串序列

标签 mysql string list sequence

我在 MySQL 中有一个表,其中包含 SERVICE、DATE_STATE、STATE 字段:

SERVICE DATE_STATE      STATE
aaaaa   '2019-12-01'    OK
aaaaa   '2019-12-03'    KO
aaaaa   '2019-12-04'    OK
...
xxxxx   '2019-12-07'    OK
xxxxx   '2019-12-09'    KO

记录在服务更改其状态的日期注册。

我想检查状态序列是否为 OK-KO 交替(依此类推,无限期地像 OK-KO-OK-KO-OK),按服务分组并按日期排序时 . 例如,像 OK-OK 或 KO-KO 这样的序列或子序列是被禁止的,我想检查和检测它们。

我不知道如何找到解决方案。

使用此查询:

SELECT service, 
        GROUP_CONCAT(state ORDER BY date_state) AS sequence_state 
FROM T
group by service

我在一个字符串中有完整的序列 'OK,KO,OK,KO...' 但我不知道如何检查字符串中的交替。

任何帮助将不胜感激。非常感谢

最佳答案

将其用作示例数据:

CREATE TABLE services (
   SERVICE varchar(50), 
   DATE_STATE date, 
   STATE varchar(2));


INSERT INTO services VALUES
  ("normal1", DATE("2000-01-01"), "OK"),
  ("normal1", DATE("2000-01-01"), "KO"),
  ("double ok", DATE("2000-01-01"), "OK"),
  ("double ok", DATE("2000-01-01"), "OK"),
  ("double ko", DATE("2000-01-01"), "KO"),
  ("double ko", DATE("2000-01-01"), "KO");

我使用 LEAD 窗口函数创建了这个查询,它可以为您提供所需的结果:

SELECT * FROM
(SELECT 
 SERVICE, 
 DATE_STATE, 
 STATE, 
 LEAD(STATE) 
    OVER (PARTITION BY SERVICE 
          ORDER BY DATE_STATE) AS NEXT_STATE
FROM services) AS services_with_next_state
WHERE STATE=NEXT_STATE;

在此处查看实际效果:https://www.db-fiddle.com/f/eMHRzJ6hN6xx4x2PjSLFXb/0

关于MySQL:检查子串序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59198049/

相关文章:

string - Perl6 有检查子串匹配的方法吗?

python - 清除 list 的不同方式

php - 如何将 mysql 结果打印到屏幕上并仅显示列的一次迭代?

mysql - 错误 : There's not enough space in/var/lib/mysql/

string - Go 中的 UTF-8 范围表

javascript - 在 .html() 和 .text() 中获取高亮文本位置

c# - List<T>.AddRange 和 yield 语句

Python,一个带有索引组合的简单总和列表

mysql - 减少 Linux 服务器上磁盘 IO 的最佳方法

mysql - 不能只显示多个交易的最大日期