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

най-активното време от деня въз основа на началния и крайния час

Ако съм разбрал правилно вашите изисквания, ако тази графика представлява потребителска активност:

       Day 
       12/1 12/2 12/3 12/4 ...
Hour 0  xx    x    x   xx
     1   x   xx        xx
     2 xxx    x    x   xx
     3   x              x
     4        x         x
     5   x              x
     6                  x
   ...

Искате да знаете, че 02:00 е времето от деня с най-висока средна активност (ред със 7 x ), а 12/4 беше най-активният ден (колона с 10 x ). Имайте предвид, че това не означава, че 02:00 на 12/4 е бил най-активният час досега, както можете да видите в примера. Ако това не е това, което искате, моля, изяснете го с конкретни примери за въвеждане и желания резултат.

Ние правим няколко предположения:

  • Записът на дейност може да започне на една дата и да завърши на следващата. Например:онлайн 2013-12-02 23:35 , офлайн 2013-12-03 00:13 .
  • Никой запис на дейност няма продължителност, по-голяма от 23 часа, или броят на тези записи е незначителен.

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

  • Най-активното време от деня ще бъде часът, с който се припокриват повече записи за активност. Обърнете внимание, че ако даден потребител започне и спре повече от веднъж през часа, това ще бъде отчетено повече от веднъж.
  • Най-активният ден ще бъде този, за който има повече уникални потребители, които са били активни по всяко време на деня.

За най-активното време на деня ще използваме малка помощна таблица, съдържаща 24-те възможни часа. Може също да се генерира и присъединява в движение с техниките, описани в други отговори.

CREATE TABLE hour ( hour tinyint not null, primary key(hour) );
INSERT hour (hour)
VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), (10)
     , (11), (12), (13), (14), (15), (16), (17), (18), (19), (20)
     , (21), (22), (23);

Тогава следните заявки дават необходимите резултати:

SELECT hour, count(*) AS activity
  FROM steamonlineactivity, hour
 WHERE ( hour BETWEEN hour(online) AND hour(offline)
      OR hour(online) BETWEEN hour(offline) AND hour
      OR hour(offline) BETWEEN hour AND hour(online) )
 GROUP BY hour
 ORDER BY activity DESC;

SELECT date, count(DISTINCT userID) AS activity
  FROM ( 
       SELECT userID, date(online) AS date
         FROM steamonlineactivity
        UNION
       SELECT userID, date(offline) AS date
         FROM steamonlineactivity
   ) AS x
 GROUP BY date
 ORDER BY activity DESC;


  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 заявка с ограничение и голямо изместване отнема завинаги

  3. Откриване на грешка при актуализиране/вмъкване на mysql поради нарушено уникално ограничение

  4. MySQL избира бързо 10 произволни реда от 600K реда

  5. MySQL (ПО ПОДРАЗБИРАНЕ + ПРИ АКТУАЛИЗИРАНЕ) TIMESTAMPs