如何通过Flag字段汇总表格中Kyle的Days数据?
如何使用Flag字段汇总表格中Kyle的Days数据?
原始数据:
| Row | Name | Flag | Days |
|---|---|---|---|
| 1 | Kyle | 0 | 12 |
| 2 | Kyle | 0 | 02 |
| 3 | Kyle | 1 | 01 |
| 4 | Kyle | 1 | 18 |
| 5 | Kyle | 1 | 01 |
| 6 | Kyle | 0 | 01 |
| 7 | Kyle | 1 | 01 |
| 8 | Kyle | 1 | 01 |
期望结果:
| Row | Name | Flag | Days |
|---|---|---|---|
| 1 | Kyle | 0 | 12 |
| 2 | Kyle | 0 | 02 |
| 3 | Kyle | 1 | 20 |
| 6 | Kyle | 0 | 01 |
| 7 | Kyle | 1 | 02 |
SQL实现方案
这属于连续相同Flag分组汇总的问题,核心逻辑是把连续的Flag=1行归为一组,汇总Days并保留每组首个Row号;Flag=0的行直接保留原样。
具体代码如下:
WITH grouped_data AS ( SELECT *, -- 给连续相同Flag的行分配统一分组ID SUM(CASE WHEN Flag != LAG(Flag, 1, -1) OVER (ORDER BY Row) THEN 1 ELSE 0 END) OVER (ORDER BY Row) AS group_id FROM your_table WHERE Name = 'Kyle' ) SELECT MIN(Row) AS Row, Name, Flag, -- Flag=1时求和并格式化为两位数,Flag=0时保留原Days CASE WHEN Flag = 1 THEN RIGHT('0' || SUM(CAST(Days AS INT)), 2) ELSE Days END AS Days FROM grouped_data GROUP BY Name, Flag, group_id ORDER BY Row;
代码说明
LAG(Flag, 1, -1):获取当前行的上一行Flag值,第一行默认用-1,确保首次分组能正常生成。SUM(...) OVER (ORDER BY Row):累计分组标识,每次Flag变化时分组ID加1,实现连续相同Flag行的分组。- 聚合阶段,
Flag=1的组计算Days总和后,用RIGHT('0' || ..., 2)将结果格式化为两位数;Flag=0的组直接保留原始Days值。
Excel Power Query实现思路
- 将数据导入Power Query,先筛选出Name为Kyle的行。
- 添加自定义列,用
List.Accumulate函数遍历行数据,判断当前行Flag是否与上一行相同,相同则分组ID不变,不同则分组ID加1,生成连续Flag的分组标识。 - 按
Name、Flag、分组ID分组:Flag=1的组取最小Row值,计算Days总和后格式化为两位数。Flag=0的组直接保留原始Row和Days值。
- 按Row排序后,将数据加载回Excel即可。
内容的提问来源于stack exchange,提问作者Guilherme
相关产品推荐
相关产品推荐

