我有以下未載入的表格: 付款日期, 使用者身份, 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 |
我認為你在IF()中嘗試的操作是錯誤的。我認為你所要求的應該應用在WHERE子句中,例如
我想要所有在過去30天內發生的所有人的交易記錄。從中,我想要他們所有購買的總金額,並按每個人分組。聽起來對嗎?
透過套用查詢的WHERE子句,你永遠不會得到任何先前的交易記錄,所以不需要在每筆記錄上套用IF()條件檢查。
修訂後的查詢。所以,你想要顯示每一筆記錄,但是只要往回看30天。所以,WHERE子句仍然適用。但現在我展示了所有正常記錄的所有列。看一下SUM()。這是在做你要求的累計總額。
注意它後面的OVER子句(我縮排只是為了顯示它與sum()過程相關的上下文)。 OVER指定了分區(類似group by,但不是普通的外部group by)。這只是意味著當這個分區值改變時重新開始。在這種情況下,是用戶ID。並且透過分區內的ORDER BY指示依照payment_date順序對資料進行排序。
我認為這應該能滿足你的需求。