Můžete to udělat pomocí skupiny podle úrovně, kterou chcete. Zde je příklad využívající vámi poskytnutá data:
Nejprve SQL vytvořte tabulku a naplňte ji. Sloupec ID zde není „potřebný“, ale doporučuje se, pokud bude tabulka velká nebo bude obsahovat indexy.
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');
Chcete-li získat seznam uspořádaných dvojic počtu minut trvání k počtu událostí:
Dotaz pak lze snadno napsat pomocí funkce timestampdiff, jak je uvedeno níže:
SELECT
TIMESTAMPDIFF(MINUTE, start, end) as minutes,
COUNT(*) AS numEvents
FROM
test.events
GROUP BY TIMESTAMPDIFF(MINUTE, start, end)
Výstup:
minutes numEvents
3 3
5 1
První parametr ve výběru může být jeden z FRAC_SECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER nebo YEAR.
Zde je několik dalších příkladů dotazů, které můžete provést:
Události podle hodin (je použita funkce patra)
SELECT
TIMESTAMPDIFF(HOUR, start, end) as hours,
COUNT(*) AS numEvents
FROM
test.events
GROUP BY TIMESTAMPDIFF(HOUR, start, end)
**Události po hodinách s lepším formátováním **
SELECT
CONCAT("<", TIMESTAMPDIFF(HOUR, start, end) + 1) as hours,
COUNT(*) AS numEvents
FROM
test.events
GROUP BY TIMESTAMPDIFF(HOUR, start, end)
Můžete seskupit podle různých možností, ale toto by vás rozhodně mělo začít. Většina vykreslovacích balíčků vám umožní zadat libovolné souřadnice x y, takže se nemusíte starat o chybějící hodnoty na ose x.
Chcete-li získat seznam uspořádaných dvojic počtu událostí v konkrétním čase (pro protokolování): Všimněte si, že toto je ponecháno pro referenci.
Nyní k dotazům. Nejprve si musíte vybrat, kterou položku chcete pro seskupení použít. Úkol může například trvat déle než minutu, takže začátek a konec budou v různých minutách. U všech těchto příkladů vycházím z času zahájení, protože tehdy se událost skutečně odehrála.
Chcete-li seskupit počty událostí po minutách, můžete použít dotaz jako tento:
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);
Všimněte si, jak se toto seskupuje podle všech položek, počínaje rokem až po minutu. Jako štítek mám zobrazenou i minutu. Výsledný výstup vypadá takto:
minute numEvents
January 1, 2015 12:00 PM 1
January 1, 2015 12:03 PM 3
Toto jsou data, která byste pak mohli vzít pomocí php a připravit je k zobrazení v jedné z mnoha knihoven grafů, vykreslit sloupec minut na ose x a vynést numEvents na osu y.
Zde je několik dalších příkladů dotazů, které můžete provést:
Události podle hodin
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);
Události podle data
SELECT
DATE_FORMAT(start, '%M %e, %Y') as date,
count(*) AS numEvents
FROM test.events
GROUP BY YEAR(start), MONTH(start), DAYOFMONTH(start);
Události podle měsíce
SELECT
DATE_FORMAT(start, '%M %Y') as date,
count(*) AS numEvents
FROM test.events
GROUP BY YEAR(start), MONTH(start);
Události podle roku
SELECT
DATE_FORMAT(start, '%Y') as date,
count(*) AS numEvents
FROM test.events
GROUP BY YEAR(start);
Měl bych také zdůraznit, že pokud máte index na počátečním sloupci této tabulky, budou tyto dotazy dokončeny rychle, dokonce i se stovkami milionů řádků.
Snad to pomůže! Pokud k tomu máte nějaké další otázky, dejte mi vědět.