Rumah > Soal Jawab > teks badan
Saya mempunyai jadual berikut yang tidak dimuatkan: tarikh pembayaran, ID Pengguna, Amaun Bulanan_30h terakhir
ID pengguna dan tarikh pembayaran datang dari jadual. Dalam monthlyAmount_last30d字段
saya ingin melihat jumlah untuk tempoh (tarikh pembayaran - 30 hari).
Saya tidak dapat memikirkan cara mengumpulkan lajur ini dengan betul untuk mendapatkan hasil seperti ini. Jika saya hanya mengumpulkan mengikut user_id
maka saya hanya melihat baris pertama dengan tarikh pembayaran (saya memerlukan semua baris, setiap satu dengan jumlah pembayaran untuk id pengguna itu yang merupakan tarikh pembayaran untuk baris itu - jumlah 30 hari ).
Jika saya mengumpulkan mengikut kedua-dua medan -> amaun bayaran yang saya dapat sentiasa sama dengan amaun pembayaran untuk baris tersebut dan bukan amaun sebenar untuk tempoh yang saya perlukan.
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
Terima kasih atas sebarang petua!
Kemas kini:
Contoh data:
user_id | Tarikh Pembayaran | kos_pesanan_gosok |
---|---|---|
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 |
Hasil yang dijangkakan:
user_id | Tarikh Pembayaran | kos_pesanan_gosok | Jumlah bulanan_terakhir30h |
---|---|---|---|
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
Saya rasa apa yang anda cuba dalam IF() adalah salah. Saya rasa apa yang anda minta harus digunakan dalam klausa WHERE seperti
Saya mahu semua rekod transaksi untuk semua orang yang berlaku dalam 30 hari yang lalu. Daripada itu, saya mahukan jumlah semua pembelian mereka, dikumpulkan mengikut setiap orang. Bunyi betul?
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)
Dengan menggunakan klausa WHERE pertanyaan, anda tidak akan mendapat sebarang rekod transaksi sebelumnya, jadi anda tidak perlu menggunakan semakan bersyarat IF() pada setiap rekod.
Pertanyaan yang disemak. Jadi, anda ingin menunjukkan setiap rekod, tetapi hanya melihat ke belakang 30 hari. Jadi, klausa WHERE masih terpakai. Tetapi sekarang saya menunjukkan semua lajur untuk semua rekod biasa. Lihatlah SUM(). Ini melakukan jumlah kumulatif yang anda minta.
Perhatikan klausa OVER selepasnya (saya mengesotkannya hanya untuk menunjukkan konteksnya berbanding prosedur sum()). OVER menentukan pembahagian (serupa dengan kumpulan mengikut, tetapi bukan kumpulan luaran biasa oleh). Ini bermakna dimulakan semula apabila nilai partition ini berubah. Dalam kes ini, ia adalah ID pengguna. Dan data diisih mengikut urutan pembayaran_tarikh melalui arahan ORDER BY dalam partition.
Saya rasa ini sepatutnya memenuhi keperluan anda.