most active time of day based on start and end time

后端 未结 7 1616
悲哀的现实
悲哀的现实 2021-02-08 06:53

I\'m logging statistics of the gamers in my community. For both their online and in-game states I\'m registering when they \"begin\" and when they \"end\". In order to show the

7条回答
  •  终归单人心
    2021-02-08 07:38

    sqlFiddle, this query will give you the period that has the most userCount, the period could be between anytime, it just gives you the start time and end time that has the most userCount

    SELECT StartTime,EndTime,COUNT(*)as UserCount FROM
    (
       SELECT T3.StartTime,T3.EndTime,GA.Started,GA.Ended FROM
           (SELECT starttime,(SELECT MIN(endtime) FROM
                             (SELECT DISTINCT started as endtime FROM gameactivity WHERE started BETWEEN  '1970-01-01 00:00:00' AND '1970-01-01 23:59:59'
                              UNION
                              SELECT DISTINCT ended as endtime  FROM gameactivity WHERE ended BETWEEN '1970-01-01 00:00:00' AND '1970-01-01 23:59:59'
                             )T1
                          WHERE T1.endtime > T2.starttime
                         )as endtime
            FROM
            (SELECT DISTINCT started as starttime FROM gameactivity WHERE started BETWEEN '1970-01-01 00:00:00' AND '1970-01-01 23:59:59'
             UNION
             SELECT DISTINCT ended as starttime  FROM gameactivity WHERE ended BETWEEN '1970-01-01 00:00:00' AND '1970-01-01 23:59:59'
            )T2
        )T3,
        GameActivity GA
        WHERE T3.StartTime BETWEEN GA.Started AND GA.Ended
        AND   T3.EndTime BETWEEN GA.Started AND GA.Ended
    )FinalTable
    GROUP BY StartTime,EndTime
    ORDER BY UserCount DESC
    LIMIT 1
    

    just change the date of '1970-01-01' occurences to the date you're trying to get data from.

    What the query does it selects all the times in the inner queries and then create intervals out of them, then join with GameActivity and count occurrences of users within those intervals and return the interval with the most userCount(most activity).

    here's an sqlFiddle with one less tier

    SELECT StartTime,EndTime,COUNT(*)as UserCount FROM
    (
    SELECT T3.StartTime,T3.EndTime,GA.Started,GA.Ended FROM
    (SELECT DISTINCT started as starttime,(SELECT MIN(ended)as endtime FROM
                       gameactivity T1 WHERE ended BETWEEN '1970-01-01 00:00:00' AND '1970-01-01 23:59:59'
                       AND T1.ended > T2.started
                      )as endtime
    FROM
     gameactivity T2
     WHERE started BETWEEN '1970-01-01 00:00:00' AND '1970-01-01 23:59:59'
     )T3,
    GameActivity GA
    WHERE T3.StartTime BETWEEN GA.Started AND GA.Ended
    AND   T3.EndTime BETWEEN GA.Started AND GA.Ended
    )FinalTable
    GROUP BY StartTime,EndTime
    ORDER BY UserCount DESC
    LIMIT 1
    

    or according to your query in your question above, you don't seem to care about dates, but only hour statistics across all dates then the below query might do it (your query just looks at the HOUR of started and ended and ignore users that play longer than 1 hour. the below query might do it for you sqlFiddle

    SELECT COUNT(*) as UserCount,
           HOURSTABLE.StartHour,
           HOURSTABLE.EndHour
    FROM
        (SELECT @hour as StartHour,
               @hour:=@hour + 1 as EndHour
         FROM
            gameActivity as OrAnyTableWith24RowsOrMore,
            (SELECT @hour:=0)as InitialValue
         LIMIT 24) as HOURSTABLE,
         gameActivity GA
    WHERE HOUR(GA.started) >= HOURSTABLE.StartHour
      AND HOUR(GA.ended) <= HOURSTABLE.EndHour
    GROUP BY HOURSTABLE.StartHour,HOURSTABLE.EndHour
    ORDER BY UserCount DESC
    LIMIT 1
    

    just delete the LIMIT 1 if you want to see userCount for other hours as well.

提交回复
热议问题