Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Histogram kueri MySql untuk data interval waktu

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ekstrak Hari / Bulan / Tahun dari Timestamp di MYSQL

  2. mysqli dan mysql masukkan ke dalam perintah database

  3. bagaimana cara mengurutkan kolom numerik varchar dengan DESC atau ASC?

  4. Kapan MENGUNCI TABEL di MySQL (tabel MyISAM)?

  5. 15 Pertanyaan Wawancara Dasar MySQL untuk Administrator Basis Data