sql >> Database teknologi >  >> RDS >> Mysql

MySql-forespørgselshistogram til data om tidsintervaller

Du kan gøre dette ved at bruge gruppe efter med det niveau, du ønsker. Her er et eksempel, hvor du bruger de data, du har givet:

Først SQL'en til at oprette tabellen og udfylde den. ID-kolonnen her er ikke "nødvendig", men det anbefales, hvis tabellen vil være stor eller have indekser på den.

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

For at få en liste over ordnede par af antal minutter varighed til antal begivenheder:

Forespørgslen kan derefter nemt skrives ved hjælp af timestampdiff-funktionen, som vist nedenfor:

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

Udgangen:

minutes      numEvents
3            3
5            1
 

Den første parameter i valget kan være en af ​​FRAC_SECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER eller YEAR.

Her er nogle flere eksempler på forespørgsler, du kan gøre:

Begivenheder pr. time (gulvfunktion anvendes)

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

**Begivenheder efter time med bedre formatering **

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

Du kan gruppere efter en række forskellige muligheder, men dette burde helt sikkert få dig i gang. De fleste plottepakker giver dig mulighed for at angive vilkårlige x y-koordinater, så du ikke behøver at bekymre dig om de manglende værdier på x-aksen.

For at få en liste over ordnede par af antal hændelser på et bestemt tidspunkt (til logning): Bemærk, at dette er overladt til reference.

Nu til spørgsmålene. Først skal du vælge, hvilken vare du vil bruge til grupperingen. For eksempel kan en opgave tage mere end et minut, så starten og slutningen ville være i forskellige minutter. For alle disse eksempler baserer jeg dem på starttidspunktet, da det er det tidspunkt, hvor begivenheden faktisk fandt sted.

For at gruppere begivenhedstællinger efter minut, kan du bruge en forespørgsel som denne:

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

Bemærk, hvordan denne grupperer efter alle punkter, startende med år, gang i minuttet. Jeg har også minuttet vist som en etiket. Det resulterende output ser således ud:

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

Dette er data, som du derefter kunne tage ved hjælp af php og forberede dem til visning af et af de mange grafiske biblioteker derude, plotte minutkolonnen på x-aksen og plotte numEvents på y-aksen.

Her er nogle flere eksempler på forespørgsler, du kan gøre:

Begivenheder efter time

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

Begivenheder efter dato

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

Begivenheder efter måned

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

Begivenheder efter år

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

Jeg skal også påpege, at hvis du har et indeks i startkolonnen for denne tabel, vil disse forespørgsler fuldføres hurtigt, selv med hundredvis af millioner af rækker.

Håber dette hjælper! Fortæl mig, hvis du har andre spørgsmål om dette.



  1. MySql auto-inkrementerende alfanumerisk primær nøgle?

  2. Installer MySQL med ansible på ubuntu

  3. MySQL:vælg elementer, der ikke er på en liste

  4. Hvordan opretter man en ny side i wordpress plugin?