[英]MySQL get the average and sum of a columns for each x minutes of a group
我嘗試了幾個小時來找出對此的查詢,但我沒有運氣。 我什至不知道僅一個查詢是否可行。
我有一張這樣的桌子
id - server_id - players_online - performance - timestamp
該表每 5-10 分鍾包含每個服務器的大約一條記錄。 問題是,我想獲得每 20 分鍾間隔的平均性能和 player_online 的總和,但由於同一服務器可能在這 20 分鍾內出現多次,因此可能會破壞我想要的最終結果:
使用 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
你的問題在於你的信息設計。 如果一時有10人在線,一會后有10人在線,你不能說是10人還是20人在線。 可能是和之前一樣的 10 個人,也可能是 10 個新人。
如果您想獲得准確的在線人數,您必須保存有助於區分您的用戶的信息,例如 IP 地址。
根據您的記錄,唯一合乎邏輯的事情是在網上獲取最多的人,例如
max(playersOnline)
這至少是在線玩家總和的下限。
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
如果您使用的是 MySql 或 SQL 並且時間戳是標准的 unix 時間戳,則最好將時間戳格式化為日期/時間格式,然后對結果進行分組。
看看http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-format
例如,您可以將時間戳更改為 DD MM YYYY HH:MM 並按此分組
GROUP BY server_id, DATE_FORMAT(timestamp, '%W %M %Y %H:%S')
編輯:認為您需要先按 server_id 分組
編輯 2:嘗試以下操作 - 無法真正測試,因為使用 now() 時時間戳已過期
SELECT serverID, avg(performance), sum(playersOnline), DATE_FORMAT(timestamp, '%W %M %Y %H:%S') FROM `stats_server` where timestamp > now()-1200 group by ROUND(timestamp/(1200)), serverID order by serverID, ROUND(timestamp/(1200)) asc
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.