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.