Oracle 18c分组聚合时指定标签值为0则新增标签聚合结果为0的实现问题
Oracle 18c newtag标签统计实现方案
完全可以通过CASE语句实现该需求,实现逻辑为先按日期维度做条件聚合,分别统计a、b、c三个标签的日均值,再通过CASE语句按规则计算newtag取值即可。
基础实现SQL(输出每日各标签均值+newtag结果)
SELECT TRUNC(Date1) AS stat_date, AVG(CASE WHEN tagname = 'a' THEN Value END) AS a_day_avg, AVG(CASE WHEN tagname = 'b' THEN Value END) AS b_day_avg, AVG(CASE WHEN tagname = 'c' THEN Value END) AS c_day_avg, -- 按规则计算newtag CASE WHEN NVL(AVG(CASE WHEN tagname = 'a' THEN Value END), 0) = 0 THEN 0 ELSE NVL(AVG(CASE WHEN tagname = 'a' THEN Value END), 0) + NVL(AVG(CASE WHEN tagname = 'b' THEN Value END), 0) + NVL(AVG(CASE WHEN tagname = 'c' THEN Value END), 0) END AS newtag FROM table1 WHERE tagname IN ('a','b','c') GROUP BY TRUNC(Date1) ORDER BY stat_date;
行格式对齐SQL(输出结构和原有group by结果一致,每行对应一个标签)
如果你需要输出结果和原有统计的日期+标签名+数值结构对齐,直接和原有其他标签的统计结果合并,可以套一层UNPIVOT处理:
WITH daily_stat AS ( SELECT TRUNC(Date1) AS stat_date, AVG(CASE WHEN tagname = 'a' THEN Value END) AS a, AVG(CASE WHEN tagname = 'b' THEN Value END) AS b, AVG(CASE WHEN tagname = 'c' THEN Value END) AS c, CASE WHEN NVL(AVG(CASE WHEN tagname = 'a' THEN Value END), 0) = 0 THEN 0 ELSE NVL(AVG(CASE WHEN tagname = 'a' THEN Value END), 0) + NVL(AVG(CASE WHEN tagname = 'b' THEN Value END), 0) + NVL(AVG(CASE WHEN tagname = 'c' THEN Value END), 0) END AS newtag FROM table1 WHERE tagname IN ('a','b','c') GROUP BY TRUNC(Date1) ) SELECT stat_date AS Date1, tagname, value FROM daily_stat UNPIVOT ( value FOR tagname IN (a AS 'a', b AS 'b', c AS 'c', newtag AS 'newtag') );
注意事项
TRUNC(Date1)用于将Oracle原生带时分秒的Date类型截断到天维度,如果你原有统计逻辑中已经做了日期格式处理,可以直接替换为你正在使用的日期字段逻辑- 代码中加入
NVL函数是为了处理当日某标签无上报数据的场景,避免空值参与计算导致结果异常,你可以根据实际业务规则调整空值的默认赋值
内容的提问来源于stack exchange,提问作者Dani V
相关产品推荐
相关产品推荐

