2017-05-26 60 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

非常感谢。这正是我需要的。继续帮助社区的人。 –