MySQL查询一天中房社访问次数最多的时间

Posted

技术标签:

【中文标题】MySQL查询一天中房社访问次数最多的时间【英文标题】:MySQL query to find hour of the day when the number of housing society visits is highest 【发布时间】:2022-01-08 03:28:48 【问题描述】:

房屋协会访问数据

Id Contact Entry_time Exit_time Duration of Stay
1 8080808080 26/07/2021 08:00:05 26/07/2021 08:23:06 181
2 9692596925 26/07/2021 08:12:49 26/07/2021 08:14:44 115
3 7099270992 26/07/2021 11:02:49 26/07/2021 11:14:44 715
4 8900289002 26/07/2021 16:12:49 26/07/2021 16:14:44 115
5 9089590895 26/07/2021 15:12:49 26/07/2021 15:14:44 115
6 8765087650 26/07/2021 19:12:49 26/07/2021 19:14:44 115
7 7862178621 26/07/2021 18:12:49 26/07/2021 18:14:44 115

访问数据可以使用多年,可能包含数百万行,因此解决方案的时间复杂度应该较低。 预期输出:8-9 AM(因为在该小时内进行的访问次数最多 (2))。

【问题讨论】:

您尝试了哪些方法,结果如何?预期结果如何? 如果一次访问持续 3 小时,应该将所有 3 小时都包含在单独的小时数中怎么办? 编辑问题并将数据作为文本而不是图像发布,这样更容易重现问题 @Firewizz 我已经更新了预期的输出。 @P.Salmon 不,我只需要出现次数最多的小时。 【参考方案1】:

当我读到这个问题时,这将对你很有帮助。 您可以采取一些措施来改善这一点:

创建单独的小时表以避免联合(或使用数字表); 单独存储时间,TIME() 方法会减慢查询速度。

.

SELECT 
    hours.`hour`,
    COUNT(occurrence.perfId) AS occurrences
FROM (
    SELECT '00:00' AS `hour`
    UNION SELECT '01:00'
    UNION SELECT '02:00'
    UNION SELECT '03:00'
    UNION SELECT '04:00'
    UNION SELECT '05:00'
    UNION SELECT '06:00'
    UNION SELECT '07:00'
    UNION SELECT '08:00'
    UNION SELECT '09:00'
    UNION SELECT '10:00'
    UNION SELECT '11:00'
    UNION SELECT '12:00'
    UNION SELECT '13:00'
    UNION SELECT '14:00'
    UNION SELECT '15:00'
    UNION SELECT '16:00'
    UNION SELECT '17:00'
    UNION SELECT '18:00'
    UNION SELECT '19:00'
    UNION SELECT '20:00'
    UNION SELECT '21:00'
    UNION SELECT '22:00'
    UNION SELECT '23:00'    
) hours
LEFT JOIN YOUR_TABLE occurrence ON hours.`hour` BETWEEN TIME(occurrence.Entry_time) AND TIME(occurrence.Exit_time)
GROUP BY hours.`hour`
ORDER BY occurrences DESC

会产生(来自测试数据库的数据):

[hour] [occurrences]
10:00   73554
11:00   67492
09:00   65679
08:00   63886
13:00   63565
12:00   62525
07:00   61500
14:00   53095
15:00   49017
16:00   41955
17:00   31991
18:00   21251
06:00   17591
19:00   13717
20:00   8532
21:00   4421
22:00   2050
23:00   818
05:00   796
04:00   561
01:00   175
03:00   123
02:00   120
00:00   23

要获取小时,只需使用查询包装并选择第一个:

SELECT hour FROM (
    # Paste query from above here...
) hourData
LIMIT 1;

【讨论】:

注明。但是暂时,你能帮我处理一下这张桌子吗?另外,我只需要将出现次数最多的小时(而不是出现次数)打印为我的表的输出,即上午 8 点到 9 点。 你的意思是每天的最大出现次数还是?? 不是每天,我需要整个表格的最大出现次数。 但是告诉我我是否错了,但计数不正是出现的次数吗? 是的,你是对的。【参考方案2】:

我能够使用以下查询获得所需的输出: SELECT HOUR(Entry_time) as hr FROM table_name GROUP BY HOUR(Entry_time) ORDER BY COUNT(*) DESC LIMIT 1; 感谢@nicholascarey 的解决方案:SQL to determine peak volume and hour for all days

【讨论】:

以上是关于MySQL查询一天中房社访问次数最多的时间的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose/MongoDB 获取一天内查看次数最多的文章

mysql慢查询分析工具比较与实战

写一个查询来找出哪支球队赢得了最多的比赛

MYSQL - 平均生日最多的一天

学习 javascript 第一天:如何使用 javascript 查找字符串中出现次数最多的字符

mysql数据库从删库到跑路之mysq索引