我有以下未加载的表格: 付款日期, 用户身份, MonthlyAmount_last30d
用户ID和付款日期来自表格。在monthlyAmount_last30d字段
中,我想看到该期间的金额(付款日期-30天)。
我无法弄清楚如何正确地对这些列进行分组以获得这样的结果。如果我只按user_id
分组,那么我只能看到一个第一行与付款日期(我需要所有行,每行都有该用户ID的付款总额,该总额是该行的付款日期-30天的总和)。
如果我按两个字段分组->我得到的付款金额始终等于该行的付款金额,而不是我需要的期间的实际金额。
select order_id, order_date, sum( if( ( order_date <= order_date and order_date >= order_date - interval 30 day), order_cost_rub, 0)) monthlyAmount_last30d, 用户身份, order_cost_rub from MyTable group by user_id
感谢任何提示!
更新:
数据示例:
user_id | 付款日期 | order_cost_rub |
---|---|---|
1 | 2022-01-01 12:00:00 | 100 |
1 | 2022-01-01 13:00:00 | 100 |
1 | 2022-01-03 20:00:00 | 150 |
2 | 2022-01-03 16:00:00 | 200 |
2 | 2022-01-15 11:00:00 | 300 |
期望的结果:
user_id | 付款日期 | order_cost_rub | monthlyAmount_last30d |
---|---|---|---|
1 | 2022-01-01 12:00:00 | 100 | 100 |
1 | 2022-01-01 13:00:00 | 100 | 200 |
1 | 2022-01-03 20:00:00 | 150 | 350 |
2 | 2022-01-03 16:00:00 | 200 | 200 |
2 | 2022-01-15 11:00:00 | 300 | 500 |
P粉1388714852023-09-12 10:16:40
我认为你在IF()中尝试的操作是错误的。我认为你所要求的应该应用在WHERE子句中,例如
我想要所有在过去30天内发生的所有人的交易记录。从中,我想要他们所有购买的总额,并按每个人分组。听起来对吗?
select user_id, payment_date, order_cost_rub, sum( order_cost_rub ) OVER ( PARTITION BY user_id order by payment_date ) AS monthlyAmount_last30d from MyTable where order_date >= subdate(curdate(), interval 30 day)
通过应用查询的WHERE子句,你永远不会得到任何之前的交易记录,所以不需要在每条记录上应用IF()条件检查。
修订后的查询。所以,你想要显示每一条记录,但是只要往回看30天。所以,WHERE子句仍然适用。但现在我展示了所有正常记录的所有列。看一下SUM()。这是在做你要求的累计总额。
注意它后面的OVER子句(我缩进只是为了显示它与sum()过程相关的上下文)。OVER指定了分区(类似于group by,但不是普通的外部group by)。这只是意味着当这个分区值改变时重新开始。在这种情况下,是用户ID。并且通过分区内的ORDER BY指示按照payment_date顺序对数据进行排序。
我认为这应该能满足你的需求。