Apakah mungkin membuat kueri sederhana untuk menghitung berapa banyak catatan yang saya miliki dalam periode waktu tertentu seperti setahun, bulan, atau hari, memiliki TIMESTAMP
bidang, seperti:
SELECT COUNT(id)
FROM stats
WHERE record_date.YEAR = 2009
GROUP BY record_date.YEAR
Atau bahkan:
SELECT COUNT(id)
FROM stats
GROUP BY record_date.YEAR, record_date.MONTH
Untuk memiliki statistik bulanan.
Terima kasih!
GROUP BY record_date.MONTH
dalam cuplikan kode pertama Anda?Jawaban:
Lihat fungsi tanggal dan waktu di MySQL.
sumber
SELECT count(*), record_date FROM anytable WHERE anytable.anycolumn = 'anycondition' GROUP BY YEAR(record_date), month(record_date);
note: record_date adalah tipe tanggal TIMESTAMPCatatan (terutama, untuk calon downvoters). Saat ini, ini mungkin tidak seefisien saran lainnya. Namun, saya meninggalkannya sebagai alternatif, dan satu juga, yang dapat berfungsi dalam melihat seberapa cepat solusi lain. (Untuk Anda tidak dapat benar-benar tahu cepat dari lambat sampai Anda melihat perbedaannya.) Juga, seiring berjalannya waktu, perubahan dapat dilakukan pada mesin MySQL terkait dengan optimasi untuk membuat solusi ini, di beberapa (mungkin, tidak begitu jauh) poin di masa depan, untuk menjadi sangat sebanding dalam efisiensi dengan kebanyakan orang lain.
sumber
EXTRACT()
mungkin lebih efisien daripadaDATE_FORMAT()
. (Saya tidak punya MySQL untuk pengujian yang tepat.)coba yang ini
Fungsi EXTRACT (unit FROM date) lebih baik karena lebih sedikit pengelompokan yang digunakan dan fungsi mengembalikan nilai angka.
Kondisi perbandingan saat pengelompokan akan lebih cepat daripada fungsi DATE_FORMAT (yang mengembalikan nilai string). Coba gunakan function | field yang mengembalikan nilai non-string untuk kondisi perbandingan SQL (WHERE, HAVING, ORDER BY, GROUP BY).
sumber
Saya mencoba menggunakan pernyataan 'DI MANA' di atas, saya pikir itu benar karena tidak ada yang memperbaikinya tetapi saya salah; setelah beberapa pencarian saya menemukan bahwa ini adalah formula yang tepat untuk pernyataan WHERE sehingga kode menjadi seperti ini:
sumber
Jika pencarian Anda lebih dari beberapa tahun, dan Anda masih ingin mengelompokkan setiap bulan, saya sarankan:
versi 1:
versi # 2 (lebih efisien) :
Saya membandingkan versi ini di atas meja besar dengan 1.357.918 baris (Innodb), dan versi ke-2 tampaknya memiliki hasil yang lebih baik.
versi1 (rata-rata 10 eksekusi) : 1,404 detik
versi2 (rata-rata 10 eksekusi) : 0,780 detik
(
SQL_NO_CACHE
kunci ditambahkan untuk mencegah MySQL dari CACHING ke kueri.)sumber
GROUP BY YEAR(record_date)*100 + MONTH(record_date)
, tetapi mengapa tidak mengujiGROUP BY YEAR(record_date), MONTH(record_date)
juga?*100
di versión # 2? Terima kasih sebelumnya.*100
keYEAR(record_date)*100 + MONTH(record_date) == DATE_FORMAT(record_date, '%Y%m')
Jika Anda ingin mengelompokkan berdasarkan tanggal di MySQL, gunakan kode di bawah ini:
Semoga ini menghemat waktu bagi mereka yang akan menemukan utas ini.
sumber
MONTH(record_date)
juga untuk akun selama beberapa bulan.Jika Anda ingin memfilter catatan untuk tahun tertentu (mis. 2000), maka optimalkan
WHERE
klausa seperti ini:Dari pada:
Hasilnya dihasilkan terhadap tabel yang berisi 300 ribu baris dan indeks pada kolom tanggal.
Adapun
GROUP BY
klausa, saya menguji tiga varian terhadap tabel yang disebutkan di atas; berikut hasilnya:Yang terakhir adalah pemenangnya.
sumber
Solusi lengkap dan sederhana dengan alternatif yang sama namun lebih pendek dan lebih fleksibel saat ini aktif:
sumber
Jika Anda ingin mendapatkan statistik bulanan dengan jumlah baris per bulan setiap tahun yang dipesan oleh bulan terbaru, cobalah ini:
sumber
Anda dapat melakukan ini hanya fungsi DATE_FORMAT () Mysql di GROUP BY. Anda mungkin ingin menambahkan kolom tambahan untuk kejelasan tambahan dalam beberapa kasus seperti di mana catatan span beberapa tahun lalu bulan yang sama terjadi di tahun yang berbeda. Di sini ada begitu banyak opsi yang dapat Anda sesuaikan ini. Baca ini sebelum mulai. Semoga ini akan sangat membantu Anda. Berikut ini contoh permintaan untuk pengertian Anda
sumber
Permintaan berikut ini berfungsi untuk saya di Oracle Database 12c Release 12.1.0.1.0
sumber
Saya lebih suka mengoptimalkan pemilihan kelompok satu tahun seperti:
Dengan cara ini Anda hanya dapat mengikat tahun sekaligus, misalnya
'2009'
, dengan parameter bernama dan tidak perlu khawatir tentang menambah'-01-01'
atau meneruskan secara'2010'
terpisah.Juga, seperti mungkin kita hanya menghitung baris dan
id
tidak pernahNULL
, saya lebih memilihCOUNT(*)
untukCOUNT(id)
.sumber
.... group by to_char(date, 'YYYY')
-> 1989.... group by to_char(date,'MM')
-> 05.... group by to_char(date,'DD')
---> 23.... group by to_char(date,'MON')
---> MEI.... group by to_char(date,'YY')
---> 89sumber