sql >> Database teknologi >  >> RDS >> Mysql

mest aktive tidspunkt på dagen baseret på start- og sluttidspunkt

Hvis jeg har forstået dine krav korrekt, hvis denne graf repræsenterer brugeraktivitet:

       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 vil gerne vide, at 02:00 er tidspunktet på dagen med den højeste gennemsnitlige aktivitet (en række med 7 x ), og 12/4 var den mest aktive dag (en kolonne med 10 x ). Bemærk, at dette ikke betyder, at 02:00 af 12/4 var den mest aktive time nogensinde, som du kan se i eksemplet. Hvis det ikke er det du ønsker, bedes du afklare med konkrete eksempler på input og ønsket resultat.

Vi gør et par antagelser:

  • En aktivitetsregistrering kan starte på én dato og slutte på den næste. For eksempel:online 2013-12-02 23:35 , offline 2013-12-03 00:13 .
  • Ingen aktivitetsregistrering har en varighed på mere end 23 timer, eller antallet af sådanne registreringer er ubetydeligt.

Og vi er nødt til at definere, hvad "aktivitet" betyder. Jeg valgte de kriterier, der var nemmere at beregne i hvert enkelt tilfælde. Begge kan gøres mere nøjagtige, hvis det er nødvendigt, på bekostning af mere komplekse forespørgsler.

  • Det mest aktive tidspunkt på dagen vil være den time, hvor flere aktivitetsregistreringer overlapper. Bemærk, at hvis en bruger starter og stopper mere end én gang i løbet af timen, vil den blive talt mere end én gang.
  • Den mest aktive dag vil være den, hvor der var flere unikke brugere, der var aktive på et hvilket som helst tidspunkt af dagen.

Til det mest aktive tidspunkt på dagen bruger vi et lille hjælpebord med de 24 mulige timer. Det kan også genereres og sammenføjes med de teknikker, der er beskrevet i andre 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);

Så giver følgende forespørgsler de nødvendige resultater:

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. Python 3.3 - Opret forbindelse til Oracle-databasen

  2. java.sql.SQLEundtagelse:Allerede lukket

  3. Lagring af flere afkrydsningsfeltsdata i MySQL-database med PHP

  4. Hvordan tilføjer man et variabelt antal timer til en dato i PostgreSQL?