sql >> Databasteknik >  >> RDS >> Mysql

MySql-frågehistogram för tidsintervalldata

Du kan göra detta med hjälp av grupp efter med den nivå du vill ha. Här är ett exempel som använder den information du angav:

Först SQL för att skapa tabellen och fylla i den. ID-kolumnen här "behövs inte" men det rekommenderas om tabellen är stor eller har index på sig.

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

För att få en lista över ordnade par av antal minuter varaktighet till antal händelser:

Frågan kan sedan enkelt skrivas med funktionen timestampdiff, som visas nedan:

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

Utdata:

minutes      numEvents
3            3
5            1

Den första parametern i valet kan vara en av FRAC_SECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER eller YEAR.

Här är några fler exempel på frågor du kan göra:

Händelser per timme (golvfunktion tillämpas)

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

**Händelser per timme med bättre formatering **

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

Du kan gruppera efter en mängd olika alternativ, men detta bör definitivt komma igång. De flesta plottningspaket låter dig ange godtyckliga x y-koordinater, så du behöver inte oroa dig för de saknade värdena på x-axeln.

För att få en lista över ordnade par med antal händelser vid en specifik tidpunkt (för loggning): Observera att detta lämnas som referens.

Nu till frågorna. Först måste du välja vilken artikel du vill använda för grupperingen. Till exempel kan en uppgift ta mer än en minut, så början och slutet skulle vara på olika minuter. För alla dessa exempel utgår jag från starttiden, eftersom det var då händelsen faktiskt ägde rum.

För att gruppera händelseräkningar per minut kan du använda en fråga som denna:

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

Notera hur detta grupperar efter alla poster, börjar med år, går på minut. Jag har också minuten visad som en etikett. Resultatet ser ut så här:

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

Det här är data som du sedan kan ta med hjälp av php och förbereda den för visning i ett av de många grafiska biblioteken där ute, rita minutkolumnen på x-axeln och plotta numEvents på y-axeln.

Här är några fler exempel på frågor du kan göra:

Händelser per timme

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

Händelser efter datum

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

Händelser per månad

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

Händelser efter år

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

Jag bör också påpeka att om du har ett index i startkolumnen för den här tabellen, kommer dessa frågor att slutföras snabbt, även med hundratals miljoner rader.

Hoppas det här hjälper! Låt mig veta om du har några andra frågor om detta.



  1. Visual Studio - Det gick inte att länka MySql-databastabellen till DataSet

  2. MariaDB Server Database Encryption Basics

  3. Databasanslutning sträng och sortering

  4. Random() i MySql?