如何利用OLAP规范实现选择性求和计算?
用OLAP函数优雅实现分组聚合需求
嘿,这个需求用OLAP体系里的窗口函数或者基础分组聚合就能轻松搞定,完全不用嵌套子查询,我给你捋清楚两种优雅的写法:
方法一:窗口函数(适合需要保留原始行+附加聚合值的场景)
如果你的场景里除了汇总数据,还需要保留每条原始记录的其他字段,窗口函数就特别合适,写法如下:
SELECT DISTINCT id, -- 计算当前id下所有value的总和 SUM(value) OVER (PARTITION BY id) AS total_value, -- 只累加state不等于0的value,得到对应总和 SUM(CASE WHEN state <> 0 THEN value ELSE 0 END) OVER (PARTITION BY id) AS non_zero_state_value FROM your_table;
关键解释:
PARTITION BY id:把整张表按id拆分成独立的“窗口”,每个窗口内都是同一个id的所有记录SUM(...) OVER (...):在每个窗口内执行聚合计算,给窗口里的每一行都返回相同的聚合结果DISTINCT:因为同一个id的每条记录都会得到相同的汇总值,所以去重后就能得到每个id唯一的汇总行
方法二:分组聚合(更简洁的汇总场景写法)
如果你的需求只是拿到每个id的汇总结果,不需要保留原始行,那直接用GROUP BY的分组聚合更高效,这也是OLAP规范里的基础操作:
SELECT id, SUM(value) AS total_value, SUM(CASE WHEN state <> 0 THEN value ELSE 0 END) AS non_zero_state_value FROM your_table GROUP BY id;
这种写法直接按id分组,在组内计算两个总和,不需要额外去重,代码更简洁,执行效率也更高。
两种方式都完全符合OLAP的规范,你可以根据自己的实际场景选择——要是需要保留原始记录就用窗口函数,要是只需要汇总结果就用分组聚合,都比子查询嵌套清爽多啦~
内容的提问来源于stack exchange,提问作者Bubaya
相关产品推荐
相关产品推荐

