【发布时间】:2022-10-25 01:05:12
【问题描述】:
我有一个订单表,其中包含下订单和完成时间的日期时间:
| orderid | userid | price | status | createdat | doneat |
|---|---|---|---|---|---|
| 1 | 128 | 100 | completed | 2/16/21 18:40:45 | 2/21/21 07:59:46 |
| 2 | 128 | 150 | completed | 2/21/21 05:27:29 | 2/23/21 11:58:23 |
| 3 | 128 | 100 | completed | 9/3/21 08:38:14 | 9/10/21 14:24:35 |
| 4 | 5 | 100 | completed | 5/28/22 23:28:07 | 6/26/22 06:10:35 |
| 5 | 5 | 100 | canceled | 7/8/22 22:28:57 | 8/10/22 06:55:17 |
| 6 | 5 | 100 | completed | 7/25/22 13:46:38 | 8/10/22 06:57:20 |
| 7 | 5 | 5 | completed | 8/7/22 18:07:07 | 8/12/22 06:56:23 |
我想要一个新列,它是创建订单时每个用户的累计总额(总价):
| orderid | userid | price | status | createdat | doneat | cumulative total when placed (per user) |
|---|---|---|---|---|---|---|
| 1 | 128 | 100 | completed | 2/16/21 18:40:45 | 2/21/21 07:59:46 | 0 |
| 2 | 128 | 150 | completed | 2/21/21 05:27:29 | 2/23/21 11:58:23 | 0 |
| 3 | 128 | 100 | completed | 9/3/21 08:38:14 | 9/10/21 14:24:35 | 250 |
| 4 | 5 | 100 | completed | 5/28/22 23:28:07 | 6/26/22 06:10:35 | 0 |
| 5 | 5 | 100 | canceled | 7/8/22 22:28:57 | 8/10/22 06:55:17 | 100 |
| 6 | 5 | 100 | completed | 7/25/22 13:46:38 | 8/10/22 06:57:20 | 100 |
| 7 | 5 | 5 | completed | 8/7/22 18:07:07 | 8/12/22 06:56:23 | 100 |
逻辑是将在当前行创建日期之前完成的所有订单的每个用户的价格相加。对于orderid=2,虽然是用户的第二笔订单,但是在其createdat datetime 2/21/21 05:27:29之前没有完成的订单,所以下单时的累计总数为0。
[5,6,7] 中的 orderid 也是如此。对于这些订单和该用户 ID,在其创建日期之前完成的唯一订单是订单 4,因此下达时的累计总数为 100。
PowerBI中的逻辑是这样的:
SUMX (
filter(
orders,
earlier orders.userid = orders.userid && orders.doneat < orders.createdat && order.status = 'completed'),
orders.price)
有人对如何在 postgresql 中实现这一点有任何提示吗?
我尝试过这样的事情,但没有奏效。
select (case when o.doneat < o.createdat over (partition by o.userid, o.status order by o.createdat)
then sum(o.price) over (partition by o.userid, o.status ORDER BY o.doneat asc ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
end) as cumulativetotal_whenplaced
from order o
谢谢
【问题讨论】:
标签: postgresql sum amazon-redshift cumulative-sum