在Google Cloud BigQuery中实现行计数与True值累计求和的SQL方案
在BigQuery中实现自增行号与TRUE值累计计数
没问题!这两个需求用BigQuery的窗口函数就能轻松搞定,我给你一步步说明:
1. 生成自增行号
用ROW_NUMBER()窗口函数就能得到从1开始的连续行号,因为你的表已经按日期排序,只需要在窗口子句里指定按日期排序即可:
ROW_NUMBER() OVER(ORDER BY date_column) AS row_num
这里要注意:即使外部查询已经写了ORDER BY,窗口函数里的ORDER BY依然不能省略——窗口函数的排序逻辑是独立的,这样才能确保行号严格按日期顺序生成。如果存在相同日期的行,ROW_NUMBER()会给它们分配不同的连续编号;要是你想让同日期的行共享同一个编号,可以换成RANK()或DENSE_RANK(),但看你要的是1、2、3……连续递增的效果,ROW_NUMBER()是最合适的。
2. 计算TRUE值的累计数量
要统计每行之前所有行中TRUE的累计数,我们可以先把布尔值转换成整数(TRUE对应1,FALSE对应0),再用SUM()窗口函数做运行总和:
SUM(CAST(boolean_column AS INT64)) OVER(ORDER BY date_column) AS cumulative_true_count
简单解释下:
CAST(boolean_column AS INT64)是把布尔值转成整数,这样才能用SUM计算总和(直接SUM布尔值会报错)OVER(ORDER BY date_column)默认的窗口范围是从第一行到当前行,正好匹配“每行之前所有行”的累计需求,你也可以写成OVER(ORDER BY date_column ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW),效果一样,只是更直白。
完整SQL示例
假设你的表名为your_table,日期列是date_col,布尔列是bool_col,完整查询如下:
SELECT date_col, bool_col, -- 生成自增行号 ROW_NUMBER() OVER(ORDER BY date_col) AS row_num, -- 计算TRUE的累计数量 SUM(CAST(bool_col AS INT64)) OVER(ORDER BY date_col) AS cumulative_true_count FROM your_table;
举个测试例子,如果你原始数据是:
| date_col | bool_col |
|---|---|
| 2024-01-01 | TRUE |
| 2024-01-02 | FALSE |
| 2024-01-03 | TRUE |
| 2024-01-04 | TRUE |
运行查询后会得到:
| date_col | bool_col | row_num | cumulative_true_count |
|---|---|---|---|
| 2024-01-01 | TRUE | 1 | 1 |
| 2024-01-02 | FALSE | 2 | 1 |
| 2024-01-03 | TRUE | 3 | 2 |
| 2024-01-04 | TRUE | 4 | 3 |
完全符合你的需求!
内容的提问来源于stack exchange,提问作者user2725109
相关产品推荐
相关产品推荐

