ClickHouse计算当前与前一行差值(delta)及百分比实现方法
若查询过程中支持对行进行索引标记,将为这类计算带来极大便利。
相邻行单列数值差值、比值计算方法
要实现连续相邻行的数值差、百分比计算,直接使用SQL标准窗口函数LAG()即可,无需额外手动标记行索引。
核心实现
你给出的参考逻辑存在一处字段引用错误:差值、比值的计算对象是按天聚合后的events统计值,而非day时间字段。结合你示例中使用的toStartOfDay语法(ClickHouse环境),可直接运行的SQL如下:
SELECT toStartOfDay(stamp) AS day, count() AS events, -- 计算当前行与上一行events的整数差值 events - LAG(events) OVER (ORDER BY day) AS difference, -- 计算当前行与上一行events的比值,保留对应小数位 round(events / LAG(events) OVER (ORDER BY day), 2) AS percent FROM records GROUP BY day ORDER BY day
关键函数说明
LAG(目标字段) OVER (ORDER BY 排序规则):按照指定排序顺序,提取当前行之前1位(默认偏移量)的目标字段值。结果第一行不存在前置行,函数默认返回NULL,和预期输出规则完全一致。- 如果需要取往前第N行的数据,只需传入第二个偏移参数即可,例如
LAG(events, 3)代表取当前行往前第3行的events值。
输出结果
执行上述SQL后,输出结构和你给出的示例完全匹配:
| day | events | difference | percent |
|---|---|---|---|
| 2022-01-06 00:00:00 | 197 | NULL | NULL |
| 2022-01-07 00:00:00 | 656 | 459 | 3.32 |
| 2022-01-08 00:00:00 | 15 | -641 | 0.02 |
| 2022-01-09 00:00:00 | 7 | -8 | 0.47 |
| 2022-01-10 00:00:00 | 137 | 130 | 19.57 |
注:示例中0.46、19.5的数值为小数保留规则差异,调整round函数的截断/四舍五入逻辑即可对齐结果。
内容的提问来源于stack exchange,提问作者Ismael Farfán
相关产品推荐
相关产品推荐

