Oracle:如何统计截至当前行的二进制列True值累计数?
解决逐行累计统计True值总数的问题
嘿,你遇到的这个场景确实不是lag()或者lead()的适用场景——这俩函数本来就是用来抓取相邻行的固定偏移数据的,没法搞定从首行到当前行的动态累计计算。不过别担心,用窗口函数的累计聚合就能轻松解决这个需求!
核心思路
我们需要用窗口函数定义一个从表的第一行一直延伸到当前行的统计范围,然后在这个范围内对data列的True值进行计数求和。
通用SQL示例
假设你的表名为your_table,还有一个用来确定行顺序的列(比如row_id,累计统计必须依赖明确的排序依据,否则结果会混乱),data是存储True/False的布尔列:
SELECT row_id, data, -- 把True转成1,False转成0,然后累计求和 SUM(CASE WHEN data THEN 1 ELSE 0 END) OVER ( ORDER BY row_id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS cumulative_true_count FROM your_table;
简化版(部分数据库支持)
像PostgreSQL、MySQL 8.0+这类数据库,布尔值可以直接隐式或显式转换为整数(True=1,False=0),所以可以简化代码:
SELECT row_id, data, SUM(data::INT) OVER (ORDER BY row_id) AS cumulative_true_count FROM your_table;
为什么这个方案可行?
OVER (ORDER BY row_id)会按照row_id的顺序来划分窗口范围,默认的窗口范围就是从第一行到当前行,所以ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW其实可以省略(不过写上更清晰)。SUM()函数在窗口范围内对转换后的数值进行累加,每一行的结果就是从首行到当前行所有True值的总数。
内容的提问来源于stack exchange,提问作者Dreamer
相关产品推荐
相关产品推荐

