PostgreSQL中如何用LAG函数计算同一用户的相邻数据差值
在PostgreSQL中计算同一用户的上一行data差值
要实现仅计算同一用户的上一行data字段差值,只需在LAG()函数的OVER子句中添加PARTITION BY user来按用户分组,同时配合ORDER BY date保证分组内的行按时间顺序排列。
完整SQL语句
SELECT id, "user", data, date, data - LAG(data) OVER (PARTITION BY "user" ORDER BY date) AS diff FROM your_table ORDER BY id;
关键说明
PARTITION BY "user":将整个数据集按user字段拆分,每个用户的数据形成独立的分组,LAG()函数只会在当前用户的分组内查找上一行数据ORDER BY date:在每个用户分组内,按date字段排序,确保获取的是该用户时间上的前一条记录- 对于每个用户的第一条数据,
LAG(data)会返回NULL,因此diff结果为空,和你期望的输出一致
执行结果
| id | user | data | date | diff |
|---|---|---|---|---|
| 1 | 1 | 1 | 2023-02-05 | |
| 2 | 2 | 1 | 2023-02-05 | |
| 3 | 1 | 2 | 2023-02-06 | 1 |
| 4 | 1 | 3 | 2023-02-07 | 1 |
| 5 | 2 | 5 | 2023-02-07 | 4 |
内容的提问来源于stack exchange,提问作者Dmitry
注:
user是PostgreSQL的保留字,因此SQL中用双引号"user"包裹字段名以避免语法错误;若你的表中该字段名未使用保留字,可去掉双引号。
相关产品推荐
相关产品推荐

