sql >> Databáze >  >> RDS >> Mysql

Histogram dotazů MySql pro data časových intervalů

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.



  1. php nahrávání souboru, jak omezit typ nahrávání souboru

  2. Jak mohu sečíst dva výsledky count(*) ve dvou různých tabulkách?

  3. Mapování JPA:QuerySyntaxException:foobar není namapován...

  4. Jak mapovat typ Enum v mybatis pomocí typeHandler na insert