MySQL中Events Logs去重:仅提取状态变更日志的技术求助
解决MySQL中去除连续重复状态记录的问题
针对你需要筛选出仅包含状态变更的非重复日志(去除连续重复的状态记录)的需求,这里提供两种适配不同MySQL版本的可行方案:
方案一:MySQL 8.0+(使用窗口函数)
利用LAG()窗口函数可以轻松获取上一行的状态值,从而筛选出状态发生变化的记录:
SELECT date_time, status FROM ( SELECT date_time, status, -- 获取当前行的上一行status值 LAG(status) OVER (ORDER BY date_time) AS prev_status FROM events_logs ) AS temp -- 保留第一行(prev_status为NULL)或状态与上一行不同的记录 WHERE prev_status IS NULL OR prev_status != status;
方案二:MySQL 5.x及以下版本(使用用户变量)
如果你的MySQL版本不支持窗口函数,可以通过用户变量跟踪前一行的状态:
SELECT date_time, status FROM ( SELECT date_time, status, -- 先将当前状态赋值给前状态变量,再更新当前状态变量 @prev_status := @curr_status, @curr_status := status FROM events_logs, -- 初始化用户变量 (SELECT @prev_status := NULL, @curr_status := NULL) AS vars -- 必须按时间排序,保证连续记录的顺序正确 ORDER BY date_time ) AS temp WHERE @prev_status IS NULL OR @prev_status != status;
这两种方案都会返回你期望的结果:
2023-05-01 00:00:33 Run1 2023-05-01 00:20:33 Fault1 2023-05-01 00:30:33 Run1 2023-05-01 00:50:33 Fault2 2023-05-01 00:53:33 Run1 2023-05-01 00:54:33 Fault3
内容的提问来源于stack exchange,提问作者Sathish
相关产品推荐
相关产品推荐

