簡體   English   中英

MySQL獲取一組每x分鍾的列的平均值和總和

[英]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 分鍾內出現多次,因此可能會破壞我想要的最終結果:

  1. 按 20 分鍾間隔分組
  2. 每 20 分鍾間隔為每個 server_id 僅保留一個結果
  3. 獲取所有服務器每 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

你的問題在於你的信息設計。 如果一時有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM