【发布时间】:2020-06-05 08:49:32
【问题描述】:
考虑下表:
+--------------------------------------------------+
| Users |
+-------+---------+----------+----------+----------+
|acc_num| user_id | date | amount | sum |
+-------+---------+----------+----------+----------+
| a1 | u1 | 20201209 | 20 | null |
| a1 | u1 | 20201209 | 20 | |
| a1 | u1 | 20201209 | 20 | |
+-------+---------+----------+----------+----------+
| a1 | u2 | 20201208 | 30 | 50 | Correct
| a1 | u2 | 20201208 | 30 | |
| a1 | u2 | 20201208 | 30 | |
+-------+---------+----------+----------+----------+
如上所示,我想根据今天和前一天计算总和。因为我在 Postgres 上,所以我正在使用 LAG 功能。但是,即使我基于 acc_num、user_id 和 date 进行分组和排序,但是当添加新的 sum 列时,值有时是 60,有时是 50。所以有时我得到上述结果,有时我得到以下结果:
+--------------------------------------------------+
| Users |
+-------+---------+----------+----------+----------+
|acc_num| user_id | date | amount | sum |
+-------+---------+----------+----------+----------+
| a1 | u1 | 20201209 | 20 | null |
| a1 | u1 | 20201209 | 20 | |
| a1 | u1 | 20201209 | 20 | |
+-------+---------+----------+----------+----------+
| a1 | u2 | 20201208 | 30 | |
| a1 | u2 | 20201208 | 30 | 60 | Wrong
| a1 | u2 | 20201208 | 30 | |
+-------+---------+----------+----------+----------+
或者我明白了:
+--------------------------------------------------+
| Users |
+-------+---------+----------+----------+----------+
|acc_num| user_id | date | amount | sum |
+-------+---------+----------+----------+----------+
| a1 | u1 | 20201209 | 20 | null |
| a1 | u1 | 20201209 | 20 | |
| a1 | u1 | 20201209 | 20 | |
+-------+---------+----------+----------+----------+
| a1 | u2 | 20201208 | 30 | |
| a1 | u2 | 20201208 | 30 | |
| a1 | u2 | 20201208 | 30 | 60 | Wrong
+-------+---------+----------+----------+----------+
现在我的 SQL 是这样的:
SELECT acc_num, user_id, date
(CASE
WHEN (amount > 0)
THEN LAG(amount, 1) OVER (ORDER BY acc_num, user_id, date) + amount
ELSE NULL
END
) AS sum
FROM Users
GROUP BY acc_num, user_id, date
ORDER BY acc_num, user_id, date
我也试过了:
SELECT acc_num, user_id, date
(CASE
WHEN (amount > 0)
THEN LAG(amount, 1) OVER (ORDER BY date) + amount
ELSE NULL
END
) AS sum
FROM Users
GROUP BY acc_num, user_id, date
ORDER BY acc_num, user_id, date
有什么想法吗?谢谢。
【问题讨论】:
-
为什么会有多行具有相同的值?
-
你的表有主键吗?
标签: sql postgresql