Anda dapat melakukan ini menggunakan group by dengan level yang Anda inginkan. Berikut adalah contoh menggunakan data yang Anda berikan:
Pertama SQL untuk membuat tabel dan mengisinya. Kolom ID di sini tidak "diperlukan" tetapi disarankan jika tabel berukuran besar atau memiliki indeks.
CREATE TABLE `test`.`events` (
`id` INT NOT NULL AUTO_INCREMENT,
`user` INT NULL,
`start` DATETIME NULL,
`end` DATETIME NULL,
`type` VARCHAR(45) NULL,
PRIMARY KEY (`id`));
INSERT INTO events (user, start, end, type) VALUES
(1, '2015-1-1 12:00:00', '2015-1-1 12:03:59', 'browsing'),
(2, '2015-1-1 12:03:00', '2015-1-1 12:06:00', 'browsing'),
(2, '2015-1-1 12:03:00', '2015-1-1 12:06:00', 'eating'),
(3, '2015-1-1 12:03:00', '2015-1-1 12:08:00', 'browsing');
Untuk mendapatkan daftar pasangan berurutan dari durasi jumlah menit hingga jumlah acara:
Kueri kemudian dapat dengan mudah ditulis menggunakan fungsi timestampdiff, seperti yang ditunjukkan di bawah ini:
SELECT
TIMESTAMPDIFF(MINUTE, start, end) as minutes,
COUNT(*) AS numEvents
FROM
test.events
GROUP BY TIMESTAMPDIFF(MINUTE, start, end)
Keluaran:
minutes numEvents
3 3
5 1
Parameter pertama yang dipilih dapat berupa FRAC_SECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, atau YEAR.
Berikut beberapa contoh kueri lainnya yang dapat Anda lakukan:
Acara menurut jam (fungsi lantai diterapkan)
SELECT
TIMESTAMPDIFF(HOUR, start, end) as hours,
COUNT(*) AS numEvents
FROM
test.events
GROUP BY TIMESTAMPDIFF(HOUR, start, end)
**Acara per jam dengan format yang lebih baik **
SELECT
CONCAT("<", TIMESTAMPDIFF(HOUR, start, end) + 1) as hours,
COUNT(*) AS numEvents
FROM
test.events
GROUP BY TIMESTAMPDIFF(HOUR, start, end)
Anda dapat mengelompokkan berdasarkan berbagai opsi, tetapi ini pasti akan membantu Anda memulai. Sebagian besar paket plot akan memungkinkan Anda untuk menentukan koordinat xy arbitrer, jadi Anda tidak perlu khawatir tentang nilai yang hilang pada sumbu x.
Untuk mendapatkan daftar pasangan berurutan dari sejumlah peristiwa pada waktu tertentu (untuk pencatatan): Perhatikan bahwa ini tersisa untuk referensi.
Sekarang untuk pertanyaan. Pertama, Anda harus memilih item mana yang ingin Anda gunakan untuk pengelompokan. Misalnya, tugas mungkin memakan waktu lebih dari satu menit, sehingga awal dan akhir akan dalam menit yang berbeda. Untuk semua contoh ini, saya mendasarkannya pada waktu mulai, karena saat itulah acara benar-benar terjadi.
Untuk mengelompokkan jumlah acara berdasarkan menit, Anda dapat menggunakan kueri seperti ini:
SELECT
DATE_FORMAT(start, '%M %e, %Y %h:%i %p') as minute,
count(*) AS numEvents
FROM test.events
GROUP BY YEAR(start), MONTH(start), DAYOFMONTH(start), HOUR(start), MINUTE(start);
Perhatikan bagaimana ini mengelompokkan semua item, dimulai dengan tahun, hingga menit. Saya juga menampilkan menit sebagai label. Output yang dihasilkan terlihat seperti ini:
minute numEvents
January 1, 2015 12:00 PM 1
January 1, 2015 12:03 PM 3
Ini adalah data yang kemudian dapat Anda ambil menggunakan php dan mempersiapkannya untuk ditampilkan oleh salah satu dari banyak pustaka grafik di luar sana, memplot kolom menit pada sumbu x, dan memplot numEvents pada sumbu y.
Berikut beberapa contoh kueri lainnya yang dapat Anda lakukan:
Acara menurut jam
SELECT
DATE_FORMAT(start, '%M %e, %Y %h %p') as hour,
count(*) AS numEvents
FROM test.events
GROUP BY YEAR(start), MONTH(start), DAYOFMONTH(start), HOUR(start);
Acara menurut tanggal
SELECT
DATE_FORMAT(start, '%M %e, %Y') as date,
count(*) AS numEvents
FROM test.events
GROUP BY YEAR(start), MONTH(start), DAYOFMONTH(start);
Acara menurut bulan
SELECT
DATE_FORMAT(start, '%M %Y') as date,
count(*) AS numEvents
FROM test.events
GROUP BY YEAR(start), MONTH(start);
Acara menurut tahun
SELECT
DATE_FORMAT(start, '%Y') as date,
count(*) AS numEvents
FROM test.events
GROUP BY YEAR(start);
Saya juga harus menunjukkan bahwa jika Anda memiliki indeks di kolom awal untuk tabel ini, kueri ini akan selesai dengan cepat, bahkan dengan ratusan juta baris.
Semoga ini membantu! Beri tahu saya jika Anda memiliki pertanyaan lain tentang ini.