mysql - 时间段的SQL

标签 mysql sql

我有网络广播(MySQL)的统计表,有这样的列:

  • IP地址
  • time_start(收听开始的日期时间)
  • time_end(收听结束的日期时间)

我需要选择每天的听众峰值,我的意思是同时唯一 ip 听众的最大数量。

如果能有那个高峰的开始和结束时间,那就太好了。

例如:

2011-30-01  |  4 listeners peak  |  from 10:30  |  till 11:25

enter image description here

最佳答案

恕我直言,将这 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/

相关文章:

php - PHP:合并多维数组,按特定键分组

sql - 帮助优化子查询

mysql - 插入更新多行mysql

php - MySQL IN 子句 - 字符串和 INT 比较

mysql - 相关子查询显示计数列

sql - 提取 month ,计算并将其放入列中

mysql - select查询在oracle中慢但在mysql数据库中快

php - 如何分解并找到 XYZ 坐标的平均值

mysql - Docker:如何在目录中使用 SQL 文件

sql - 如何根据与 "val2"匹配的条件,从 "val1A-val2A~val1B-val2B~val1C-val2C"等格式的字符串中子串 "val1"?