求SQL查询语句:计算各Item不同时间点Total的增量值
编写SQL计算Item的时间维度TOTAL差值
原始数据表(结构及数据)
Time |Item| TOTAL ----------------- 000 | 1| 111 ----------------- 000 | 2| 113 ----------------- 001 | 1| 113 ----------------- 001 | 2| 143 ----------------- 002 | 1| 173 ----------------- 002 | 2| 183
需求说明
按Time维度计算每个Item当前时间点的TOTAL与上一时间点的TOTAL的差值,其中初始时间(Time=000)的差值固定为0,期望输出如下:
Time |Item| TOTAL ----------------- 000 | 1| 0 ----------------- 000 | 2| 0 ----------------- 001 | 1| 2 ----------------- 001 | 2| 30 ----------------- 002 | 1| 60 ----------------- 002 | 2| 40
计算逻辑示例:Time=001、Item=1时,差值为113-111=2;Time=001、Item=2时,差值为143-113=30,以此类推。
解决方案SQL
使用窗口函数LAG()实现需求,兼容MySQL 8+、PostgreSQL、SQL Server等主流SQL方言:
SELECT Time, Item, CASE WHEN Time = '000' THEN 0 ELSE TOTAL - LAG(TOTAL) OVER (PARTITION BY Item ORDER BY Time) END AS TOTAL FROM your_table_name;
代码说明
PARTITION BY Item:按Item分组,确保仅计算同一Item的时间序列差值ORDER BY Time:保证时间维度按顺序排列,让LAG()能正确获取上一个时间点的TOTAL值CASE语句专门处理初始时间(Time='000')的差值为0的情况
内容的提问来源于stack exchange,提问作者Golden
相关产品推荐
相关产品推荐

