我在 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/