【发布时间】:2014-07-07 18:12:26
【问题描述】:
我尝试了几个小时来找出一个查询,但我没有运气。我什至不知道是否可以仅使用一个查询。
我有一张这样的桌子
id - server_id - players_online - performance - timestamp
此表每 5-10 分钟包含每台服务器的大约一条记录。 问题是,我想获得平均性能和每 20 分钟间隔的 player_online 总和,但由于同一服务器可能在这 20 分钟内多次出现,它可能会破坏我想要的最终结果:
- 按 20 分钟间隔分组
- 每个 server_id 每 20 分钟只保留一个结果
- 获取所有服务器每 20 分钟的平均性能和 player_online 总和
使用 ROUND(timestamp/(20*60)) 我可以轻松地按 20 分钟间隔分组,但我该如何继续。你会怎么写查询?
到目前为止我尝试过的查询:
SELECT avg(performance) as performance, sum(playersOnline) as playersOnline, timestamp
FROM stats_server
GROUP BY ROUND(timestamp/(1200))
示例数据: http://www.mediafire.com/download/z629q3g38qhr46h/stats_server.sql.gz
结果(本次来自服务器的平均值/总和):
timestamp | performance | online players
1404757200000 | 93 | 125
1404758400000 | 92 | 120
1404759600000 | 96 | 133
1404759800000 | 93 | 168
1404751000000 | 88 | 122
1404751200000 | 94 | 134
解决方案:
SELECT min20 * 1200 AS timestamp, AVG( performance ) AS performance, SUM( players ) AS playersOnline
FROM (
SELECT serverID, FLOOR( UNIX_TIMESTAMP( timestamp ) / 1200 ) AS min20, AVG( performance ) AS performance, AVG( playersOnline ) AS players
FROM stats_server
GROUP BY min20, serverID
) tmp
GROUP BY min20
ORDER BY timestamp
【问题讨论】: