2017-05-26 64 views
1

我想在過去的6個星期獲得player_count周逐周列的平均沿周結束。但問題是,我還希望與特定平均數對應的星期幾的開始和結束日期。的MySQL,選擇開始,平均一列(周逐周)

我曾嘗試:

SELECT AVG(player_count) as average, 
    updated_at, 
    updated_at + INTERVAL WEEKDAY(updated_at) + 7 DAY as EndDate 
FROM `gtan_servers` 
WHERE server_short_name = 'FiveRP' 
GROUP BY WEEK(updated_at) 
ORDER BY updated_at DESC 
LIMIT 6 

updated_at列意欲認爲作爲一週的開始和EndDate將被視爲一週的結束,玩家數量的特定平均被提供。

但是這個查詢在星期日期不能正常工作。我可以取平均值,但是星期日期沒有被正確提取。任何幫助將不勝感激。

回答

1

您需要一個表達式,截斷任意日期到它出現的星期的第一天。也就是說,如果你給它的話,它會返回2017-05-21(星期日)2017-05-24

這個表達式確實如此,假設你的星期在週日開始。 Here's an explanation.

FROM_DAYS(TO_DAYS(datestamp) -MOD(TO_DAYS(datestamp) -1, 7)) 

然後,你需要使用它作爲GROUP BY表達和WHERE表達。

SELECT AVG(player_count) as average, 
    FROM_DAYS(TO_DAYS(updated_at) -MOD(TO_DAYS(updated_at) -1, 7)) week_beginning, 
    FROM_DAYS(TO_DAYS(updated_at) -MOD(TO_DAYS(updated_at) -1, 7)) + INTERVAL 6 DAY week_ending 
FROM `gtan_servers` 
WHERE server_short_name = 'FiveRP' 
    AND updated_at >= FROM_DAYS(TO_DAYS(NOW()) -MOD(TO_DAYS(NOW()) -1, 7)) - INTERVAL 6 WEEK 
GROUP BY FROM_DAYS(TO_DAYS(updated_at) -MOD(TO_DAYS(updated_at) -1, 7)) 
ORDER BY 2 DESC 
LIMIT 6 

WHERE自動過濾掉表格中對您的報告來說太舊的記錄。

該查詢得到了一點重複,但它很好地工作。

您可以創建一個存儲的功能是這樣的:

DELIMITER $$ 
DROP FUNCTION IF EXISTS TRUNC_SUNDAY$$ 
CREATE 
    FUNCTION TRUNC_SUNDAY(datestamp DATETIME) 
    RETURNS DATE DETERMINISTIC NO SQL 
    COMMENT 'returns preceding Sunday' 
    RETURN FROM_DAYS(TO_DAYS(datestamp) -MOD(TO_DAYS(datestamp) -1, 7))$$ 
DELIMITER ; 

然後將查詢變得更加可讀:

SELECT AVG(player_count) as average, 
    TRUNC_SUNDAY(updated_at) week_beginning, 
    TRUNC_SUNDAY(updated_at) + INTERVAL 6 DAY week_ending 
FROM `gtan_servers` 
WHERE server_short_name = 'FiveRP' 
    AND updated_at >= TRUNC_SUNDAY(NOW()) - INTERVAL 6 WEEK 
GROUP BY TRUNC_SUNDAY(updated_at) 
ORDER BY TRUNC_SUNDAY(updated_at) DESC 
LIMIT 6 

如果周開始每週一改-1-2

+0

非常感謝。這正是我需要的。繼續幫助社區的人。 –