MariaDB按唯一键遇零分段聚合UAS值并统计事件次数的SQL问题
MariaDB按连续非零UAS分段统计方案
你需要实现的是典型的SQL孤岛(连续值分组)统计需求,MariaDB 10.2及以上版本支持窗口函数,可直接使用如下查询适配Grafana场景:
WITH filtered_data AS ( -- 第一步:过滤有效数据,应用Grafana时间范围、排除异常值 SELECT pv.id, pv.time, pv.uas, pd.system, pd.parameter_label FROM parameter_health.parameter_uasvalue pv LEFT JOIN parameter_health.parameter_detail pd ON pd.id = pv.id WHERE $__timeFilter(pv.time) AND pv.uas != '-1' ), group_mark AS ( -- 第二步:给连续非零段打分组标记,每遇到0则标记+1 SELECT *, SUM(CASE WHEN uas = 0 THEN 1 ELSE 0 END) OVER ( PARTITION BY id ORDER BY time ASC ) AS seg_mark FROM filtered_data ) -- 第三步:按参数和分段标记聚合统计 SELECT system, parameter_label, COUNT(DISTINCT seg_mark) AS '总事件次数', SUM(uas) AS '总不可用秒数(Total UAS)' FROM group_mark WHERE uas != 0 -- 过滤全0的无效段 GROUP BY system, parameter_label;
补充说明
如果你需要查看每一次异常事件的单独UAS求和结果,只需要把最后一层的聚合逻辑替换为按id, seg_mark分组,输出SUM(uas)即可,对应你示例中的输出就是1030、1400、900三条结果。如果你的MariaDB版本低于10.2不支持窗口函数,可以用用户变量替代窗口函数实现分组标记,核心逻辑和上述方案一致。
内容的提问来源于stack exchange,提问作者Ramanan
相关产品推荐
相关产品推荐

