Heim > Fragen und Antworten > Hauptteil
Ich habe die folgende Tabelle, die nicht geladen wird: Zahlungsdatum, Benutzer-ID, MonthlyAmount_last30d
Benutzer-ID und Zahlungsdatum stammen aus der Tabelle. In monthlyAmount_last30d字段
möchte ich den Betrag für den Zeitraum sehen (Zahlungsdatum – 30 Tage).
Ich weiß nicht, wie ich diese Spalten richtig gruppieren soll, um ein Ergebnis wie dieses zu erhalten. Wenn ich nur nach user_id
gruppiere, sehe ich nur eine erste Zeile mit dem Zahlungsdatum (ich brauche alle Zeilen, jede mit der Zahlungssumme für diese Benutzer-ID, die das Zahlungsdatum für diese Zeile ist – die Summe von 30 Tagen).
Wenn ich nach beiden Feldern gruppiere -> entspricht der Zahlungsbetrag, den ich erhalte, immer dem Zahlungsbetrag für diese Zeile und nicht dem tatsächlichen Betrag für den von mir benötigten Zeitraum.
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
Vielen Dank für jeden Tipp!
Update:
Datenbeispiel:
Benutzer-ID | Zahlungsdatum | 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 |
Erwartete Ergebnisse:
Benutzer-ID | Zahlungsdatum | 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顺序对数据进行排序。
我认为这应该能满足你的需求。