Kelompokkan ke interval
Anda harus menggunakan group by
untuk membuat satu grup untuk setiap interval yang ingin Anda rata-ratakan.
select avg(Column), convert((min(datetime) div 500)*500 + 230, datetime) as time
from Databasename.tablename
where datetime BETWEEN '2012-09-08 00:00:00' AND '2012-09-08 15:30:00'
group by datetime div 500
Ini memanfaatkan fakta bahwa tanggal dan waktu secara implisit dapat dikonversi ke angka, yang kemudian akan menjadi format YYMMDDhhmmss
. Membagi angka tersebut dengan 100 menghapus detik, dan juga membagi dengan 500 menghasilkan angka unik untuk setiap interval 5 menit.
Kolom tambahan yang saya pilih akan memberikan pertengahan interval:kapan saja dari interval (di sini memilih minimum, tetapi itu tidak terlalu penting), berubah menjadi nomor interval 5 menit itu, kembali menjadi tanggal dan waktu nomor, dan kemudian menambahkan dua setengah menit. Anda dapat menggunakan sintaks serupa untuk menghitung awal (cukup tinggalkan + 230
keluar) atau (termasuk) akhir (+ 459
) dari interval.
Diuji menggunakan sqlfiddle .
Penanganan akhir jangkauan
Perhatikan bahwa BETWEEN
rentang akan menyertakan baris dari 15:30:00
tetapi tidak ada orang lain dari interval yang dimulai pada saat itu. Mungkin Anda ingin mengecualikan akhir rentang dari pilihan Anda:
where datetime >= '2012-09-08 00:00:00' AND datetime < '2012-09-08 15:30:00'
Mengapa Anda mendapatkan NULL
Mengapa kueri Anda menghasilkan NULL
:Untuk melakukan aritmatika interval, Anda tidak menyertakan seluruh interval dalam tanda kutip, dan Anda menggunakan nama tunggal untuk satuan waktu. Yaitu
'2012-09-08 15:30:00' + INTERVAL 5 minute
Tapi ini hanya akan memperluas jangkauan ke 2012-09-08 15:35:00
dan masih belum membuat interval 5 menit yang Anda inginkan. Cara Anda menulisnya, Anda mencoba menambahkan dua string, yang tidak mungkin dilakukan di MySQL kecuali jika string tersebut dapat diubah menjadi angka, dalam hal ini angka-angka tersebut akan ditambahkan.
Anda mungkin ingin menggunakan aritmatika interval untuk menghitung akhir eksklusif interval, yaitu detik pertama setelah intervalnya:
convert((min(datetime) div 500)*500, datetime) + INTERVAL 5 minute as endOfInterval
Cukup tambahkan 500
bukannya 230
kueri saya tidak akan berfungsi karena angka yang dihasilkan mungkin menunjukkan tanggal yang tidak valid untuk interval terakhir setiap jam.