获得每月每天的价值

时间:2014-05-28 13:05:53

标签: mysql

我有一张桌子:

+--------------+
| stat         |
+--------------+
| date         |
| onlineUsers  |
| messagesSent |
+--------------+

我每10分钟收集一次统计信息并将其保存到db。如何使用单个SQL查询在一段时间内获得date, max(OnlineUsers), sum(messagesSent)的每一天?

2 个答案:

答案 0 :(得分:0)

简单如下:

SELECT date, MAX(OnlineUsers), SUM(messagesSent)
FROM stat
WHERE date BETWEEN '2014-05-01' AND '2014-05-31'
GROUP BY date

答案 1 :(得分:0)

在这种情况下的一般问题是并非所有时间段都有任何数据。因此,你得到一个差距。例如,如果您想知道每个月每天登录系统的人数,您可以这样做: -

SELECT logon_date, COUNT(*)
FROM logon_table
GROUP BY logon_date

如果有人没有登录,那么那个日期会丢失,而你可能希望那个日期的数量为0.当你尝试用结果绘制图表时,这个问题就变得非常明显了。

解决方案是生成所有基本单位的范围,然后将其与实际数据相结合。

例如: -

SELECT aDate, MAX(OnlineUsers), SUM(messagesSent)
FROM 
(
    SELECT DATE_ADD('2014-05-01', INTERVAL units.i + 10 * tens.i DAY) AS aDate
    FROM (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units
    CROSS JOIN (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens
)
LEFT OUTER JOIN stat
ON sta.`date` = sub1.aDate
WHERE aDate BETWEEN '2014-05-01' AND '2014-05-31'
GROUP BY aDate

这是使用几个子查询生成从0到99的所有数字并将其添加到开始日期(您可以添加一个较小的数字,这只是为了方便)。然后将实际数据连接到此日期列表,并从结果中使用聚合函数来获取所需的详细信息。

您可以轻松地将这个想法扩展到不同的时间段(例如,一天中的小时等)。