从 SQL 到 SPL:按条件分段累计
某库表的 id 字段用于排序,logic 字段用于条件判断,val 用于分段累计。
id | logic | val |
1 | true | 1 |
2 | false | 2 |
3 | false | 3 |
4 | false | 4 |
5 | true | 0 |
6 | false | 1 |
7 | false | 2 |
现在要新增计算列 output,当 logic==true 时,output 置为 1,否则对 output 进行累计,取值为上一行的 output+val。
id | logic | val | output |
1 | true | 1 | 1 |
2 | false | 2 | 3 |
3 | false | 3 | 6 |
4 | false | 4 | 10 |
5 | true | 0 | 1 |
6 | false | 1 | 2 |
7 | false | 2 | 4 |
SQL:
with table1 as (
SELECT *, countif(logic) over win1 as logic_run
FROM example_data
window win1 as (order by id rows between unbounded preceding and current row)
)
SELECT *,
sum(val) over win2 as sum_over,
sum(if(logic,1,val)) over win2 as output
from table1
window win2 as (partition by logic_run order by id rows between unbounded preceding and current row)
SQL要用多个窗口函数 + 子查询间接实现累计计算,代码繁琐。SPL 提供了相对位置语法,可以直接进行累计:https://try.esproc.com/splx?4Xb
A | |
1 | $select * from example_data.txt order by id |
2 | =A1.derive(if(logic,1,output[-1]+val):output) |
A1:加载数据。
A2:新增计算列,如果 logic 为 true,则置为 1;否则置为上一行的 output+val。[-1] 表示上一行。
英文版 https://c.esproc.com/article/1742292554862