Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Histogram zapytań MySql dla danych przedziałów czasowych

Możesz to zrobić za pomocą grupowania według wybranego poziomu. Oto przykład wykorzystujący dane, które podałeś:

Najpierw SQL, aby utworzyć tabelę i wypełnić ją. Kolumna ID w tym miejscu nie jest "potrzebna", ale jest zalecana, jeśli tabela będzie duża lub zawiera indeksy.

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');

Aby uzyskać listę uporządkowanych par liczby minut czasu trwania do liczby zdarzeń:

Zapytanie można następnie łatwo napisać za pomocą funkcji timestampdiff, jak pokazano poniżej:

SELECT 
    TIMESTAMPDIFF(MINUTE, start, end) as minutes,
    COUNT(*) AS numEvents
FROM
    test.events
GROUP BY TIMESTAMPDIFF(MINUTE, start, end)

Wynik:

minutes      numEvents
3            3
5            1

Pierwszym parametrem wyboru może być FRAC_SECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MIESIĄC, QUARTER lub YEAR.

Oto kilka przykładów zapytań, które możesz wykonać:

Zdarzenia według godziny (zastosowana jest funkcja podłogi)

SELECT 
    TIMESTAMPDIFF(HOUR, start, end) as hours,
    COUNT(*) AS numEvents
FROM
    test.events
GROUP BY TIMESTAMPDIFF(HOUR, start, end)

**Wydarzenia godzinowe z lepszym formatowaniem **

SELECT 
    CONCAT("<", TIMESTAMPDIFF(HOUR, start, end) + 1) as hours,
    COUNT(*) AS numEvents
FROM
    test.events
GROUP BY TIMESTAMPDIFF(HOUR, start, end)

Możesz grupować według różnych opcji, ale to zdecydowanie powinno Cię zacząć. Większość pakietów do kreślenia pozwala określić dowolne współrzędne x y, więc nie musisz się martwić o brakujące wartości na osi x.

Aby uzyskać listę uporządkowanych par liczby zdarzeń w określonym czasie (do rejestrowania): Pamiętaj, że jest to pozostawione w celach informacyjnych.

Teraz pytania. Najpierw musisz wybrać, którego przedmiotu chcesz użyć do grupowania. Na przykład zadanie może zająć więcej niż minutę, więc początek i koniec będą miały różne minuty. W przypadku wszystkich tych przykładów opieram je na czasie rozpoczęcia, ponieważ to wtedy faktycznie miało miejsce wydarzenie.

Aby pogrupować liczbę zdarzeń według minuty, możesz użyć zapytania w ten sposób:

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);

Zwróć uwagę, jak to grupuje według wszystkich pozycji, zaczynając od roku, przechodząc do minuty. Mam też minutę wyświetlaną jako etykieta. Wynikowy wynik wygląda tak:

minute                      numEvents
January 1, 2015 12:00 PM    1
January 1, 2015 12:03 PM    3

Są to dane, które można następnie pobrać za pomocą php i przygotować je do wyświetlenia przez jedną z wielu bibliotek graficznych, wykreślając kolumnę minut na osi x i wykreślając liczbę zdarzeń na osi y.

Oto kilka przykładów zapytań, które możesz wykonać:

Wydarzenia według godziny

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);

Wydarzenia według daty

SELECT 
    DATE_FORMAT(start, '%M %e, %Y') as date, 
    count(*) AS numEvents 
FROM test.events 
GROUP BY YEAR(start), MONTH(start), DAYOFMONTH(start);

Wydarzenia według miesiąca

SELECT 
    DATE_FORMAT(start, '%M %Y') as date, 
    count(*) AS numEvents 
FROM test.events 
GROUP BY YEAR(start), MONTH(start);

Wydarzenia według roku

SELECT 
    DATE_FORMAT(start, '%Y') as date, 
    count(*) AS numEvents 
FROM test.events 
GROUP BY YEAR(start);

Powinienem również zauważyć, że jeśli masz indeks w kolumnie początkowej dla tej tabeli, zapytania te zakończą się szybko, nawet przy setkach milionów wierszy.

Mam nadzieję że to pomoże! Daj mi znać, jeśli masz inne pytania na ten temat.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kiedy dodać indeks do pola tabeli SQL (MySQL)?

  2. JSON_REPLACE() – Zamień wartości w dokumencie JSON w MySQL

  3. MySQL — alternatywy dla zagnieżdżonych podzapytań przy ograniczaniu agregacji danych w skorelowanym podzapytaniu

  4. Tabela błędów Mysql 1050 już istnieje, podczas gdy w rzeczywistości tak nie jest

  5. Jak Zend DB zarządza połączeniami z bazą danych