Mysql
 sql >> база данни >  >> RDS >> Mysql

MySql хистограма на заявка за данни за интервали от време

Можете да направите това, като използвате група по с нивото, което искате. Ето пример, използващ данните, които сте предоставили:

Първо SQL, за да създадете таблицата и да я попълните. Идентификационната колона тук не е „необходима“, но се препоръчва, ако таблицата ще е голяма или ще има индекси в нея.

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

За да получите списък с подредени двойки от продължителност на минути към брой събития:

След това заявката може лесно да бъде написана с помощта на функцията timestampdiff, както е показано по-долу:

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

Резултатът:

minutes      numEvents
3            3
5            1

Първият параметър в избора може да бъде един от FRAC_SECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER или YEAR.

Ето още няколко примера за заявки, които можете да направите:

Събития по час (прилага се функцията на етажа)

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

**Събития по час с по-добро форматиране **

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

Можете да групирате по различни опции, но това определено трябва да ви помогне да започнете. Повечето пакети за начертаване ще ви позволят да зададете произволни координати x y, така че не е нужно да се притеснявате за липсващите стойности по оста x.

За да получите списък с подредени двойки от брой събития в определено време (за регистриране): Имайте предвид, че това е оставено за справка.

Сега за запитванията. Първо трябва да изберете кой артикул искате да използвате за групирането. Например една задача може да отнеме повече от минута, така че началото и краят ще бъдат в различни минути. За всички тези примери ги базирам на началния час, тъй като това е моментът, когато събитието всъщност се е състояло.

За да групирате броя на събитията по минута, можете да използвате заявка като тази:

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

Обърнете внимание как това се групира по всички елементи, като се започне от годината, продължавайки до минутата. Имам също така показаната минута като етикет. Полученият резултат изглежда така:

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

Това са данни, които след това можете да вземете с помощта на php и да ги подготвите за показване от една от многото графични библиотеки там, като начертаете колоната за минути по оста x и начертаете numEvents по оста y.

Ето още няколко примера за заявки, които можете да направите:

Събития по час

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

Събития по дата

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

Събития по месеци

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

Събития по година

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

Трябва също да отбележа, че ако имате индекс в началната колона за тази таблица, тези заявки ще завършат бързо, дори със стотици милиони редове.

Надявам се това да помогне! Кажете ми, ако имате други въпроси относно това.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. свържете се отдалечено с mysql

  2. Предупреждение:mysql_num_rows() очаква параметър 1 да бъде ресурс, булев, даден в /home/folder/public_html/folder/folder/login.php на ред 18

  3. Въвеждане на парола за MySQL в bash скрипт

  4. има ли начин да изброите всички запазени думи в mysql с помощта на помощната програма на командния ред mysql

  5. помогнете ми да разбера сега() за текущото време на mysql и неговите часови зони