次のテーブルがありますが、読み込まれていません: 支払期日、 ユーザーID、 MonthlyAmount_last30d
ユーザー ID と支払い日はテーブルから取得されます。 monthlyAmount_last30d フィールド
で、期間 (支払日 - 30 日) の金額を確認したいと思います。
これらの列を正しくグループ化してこのような結果を得る方法がわかりません。 user_id
だけでグループ化した場合、支払い日を含む最初の行のみが表示されます (すべての行が必要です。各行にはそのユーザー ID の支払い合計があり、合計はその行の日付の支払いです) - 30 日の合計)。
両方のフィールドでグループ化した場合 -> 取得する支払い金額は常にその行の支払い金額と等しく、必要な期間の実際の金額ではありません。
ヒントをありがとう!
更新:
データ例:
order_cost_rub | ||
---|---|---|
100 | 1 | |
100 | 1 | |
150 | 2 | |
200 | 2 | |
300 | ###予想された結果: ### |
monthlyAmount_last30d
1 | 2022-01-01 12:00:00 | 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 順に並べ替えられます。
これはあなたのニーズを満たすはずだと思います。