我有网络广播(MySQL)的统计表,有这样的列:
- IP地址
- time_start(收听开始的日期时间)
- time_end(收听结束的日期时间)
我需要选择每天的听众峰值,我的意思是同时唯一 ip 听众的最大数量。
如果能有那个高峰的开始和结束时间,那就太好了。
例如:
2011-30-01 | 4 listeners peak | from 10:30 | till 11:25
最佳答案
恕我直言,将这 35,000 行加载到内存中、枚举它们并在给定时刻维护并发监听器的计数会更简单。
如果您以以下格式加载行,这会更简单:
IP, Time, flag_That_Indicate_StartOrStop_Listening_For_This_Given_IP
因此您将能够按时间顺序加载数据,并且您应该简单地枚举所有行以维护一个监听 IP 列表。
无论如何,您如何考虑来自同一 IP 的多个连接?
使用同一 IP 地址的 NAT 后面可以有 10 个不同的监听器。
更新: 你真的不需要改变数据库结构,使用不同的 SQL 来加载数据就足够了
SELECT ip_address, Time_Start AS MyTime, 1 As StartStop
FROM MyTable
ORDER BY Time_Start
UNION ALL
SELECT ip_address, Time_Stop AS MyTime, 0 As StartStop
FROM MyTable
使用此 SQL,您应该能够加载所有数据,然后枚举所有行。
正确排序行很重要。
if StartStop = 1 its someone that start listening --> 将其 IP 添加到监听器列表,并将监听器计数增加 1
如果 StartStop = 0 它是停止收听的人 --> 从收听者列表中删除它的 IP,并将收听者计数减 1
并在枚举循环中检查何时达到最大并发监听器数量
关于mysql - 时间段的SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9065758/