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

nejaktivnější denní dobu podle času začátku a konce

Pokud jsem správně pochopil vaše požadavky, pokud tento graf představuje aktivitu uživatele:

       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
   ...

Chcete vědět, že 02:00 je čas dne s nejvyšší průměrnou aktivitou (řádek se 7 x ) a 12/4 byl nejaktivnější den (sloupec s 10 x ). Všimněte si, že to neznamená, že 02:00 ze 12/4 byla vůbec nejaktivnější hodinou, jak můžete vidět na příkladu. Pokud to není to, co chcete, ujasněte si prosím konkrétní příklady vstupu a požadovaného výsledku.

Vycházíme z několika předpokladů:

  • Záznam aktivity může začít v jeden den a skončit v další. Například:online 2013-12-02 23:35 , offline 2013-12-03 00:13 .
  • Žádný záznam o činnosti netrvá déle než 23 hodin nebo je počet takových záznamů zanedbatelný.

A musíme definovat, co znamená „aktivita“. Vybral jsem kritéria, která se v každém případě snáze vypočítala. Obojí lze v případě potřeby zpřesnit za cenu složitějších dotazů.

  • Nejaktivnější denní dobou bude hodina, se kterou se překrývá více záznamů aktivit. Pamatujte, že pokud uživatel během hodiny spustí a zastaví více než jednou, bude to započítáno více než jednou.
  • Nejaktivnějším dnem bude den, kdy bylo v kteroukoli denní dobu aktivních více jedinečných uživatelů.

Pro nejaktivnější denní dobu použijeme malý pomocný stůl s 24 možnými hodinami. Lze jej také generovat a spojovat za běhu pomocí technik popsaných v jiných odpovědích.

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

Potom následující dotazy poskytnou požadované výsledky:

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. GROUP BY vs. ORDER BY

  2. Pandas 0.20.2 to_sql() pomocí MySQL

  3. Nelze vybrat seskupení řádků podle created_at

  4. Vrátí nadřazené záznamy s podřízenými záznamy rovnými konkrétním hodnotám A kde se celková množina podřízených záznamů pro daného rodiče rovná konkrétní hodnotě