sql >> Databasteknik >  >> RDS >> Mysql

mest aktiva tiden på dygnet baserat på start- och sluttid

Om jag förstått dina krav rätt, om denna graf representerar användaraktivitet:

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

Du vill veta att 02:00 är den tid på dygnet med högst genomsnittlig aktivitet (en rad med 7 x ), och 12/4 var den mest aktiva dagen (en kolumn med 10 x ). Observera att detta inte betyder att 02:00 den 12/4 var den mest aktiva timmen någonsin, som du kan se i exemplet. Om detta inte är vad du vill, förtydliga gärna med konkreta exempel på input och önskat resultat.

Vi gör ett par antaganden:

  • En aktivitetspost kan börja på ett datum och sluta på nästa. Till exempel:online 2013-12-02 23:35 , offline 2013-12-03 00:13 .
  • Ingen aktivitetspost har en längre varaktighet än 23 timmar, eller så är antalet sådana poster försumbart.

Och vi måste definiera vad "aktivitet" betyder. Jag valde de kriterier som var lättare att beräkna i varje fall. Båda kan göras mer exakta om det behövs, till priset av mer komplexa frågor.

  • Den mest aktiva tiden på dygnet är den timme med vilken fler aktivitetsposter överlappar. Observera att om en användare startar och stannar mer än en gång under timmen kommer den att räknas mer än en gång.
  • Den mest aktiva dagen kommer att vara den för vilken det fanns fler unika användare som var aktiva när som helst på dagen.

För den mest aktiva tiden på dygnet kommer vi att använda ett litet extrabord som håller de 24 möjliga timmarna. Den kan också genereras och sammanfogas i farten med de tekniker som beskrivs i andra svar.

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

Sedan ger följande frågor de önskade resultaten:

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. Skillnad mellan Oracle jdbc-drivrutinsklasser?

  2. Django ORM lämnar lediga anslutningar på Postgres DB

  3. Hur visar jag det fullständiga innehållet i en text- eller varchar(MAX)-kolumn i SQL Server 2008 Management Studio?

  4. Hur man formaterar siffror som romerska siffror i Oracle