我搜索了这个问题的SO,发现了一些类似的帖子但是无法适应我的需求。
我有一个带有服务器请求的数据库,因为它永远存在,每个都有一个时间戳,我试图想出一个允许我创建热矩图(CCC HeatGrid)的查询。
sql查询结果必须表示按每个工作日的每小时分组的服务器负载。
像这样:Example table
我只需要SQL查询,我知道如何创建图表。
谢谢,
答案 0 :(得分:0)
那些看起来像"计数"行。
其中一个问题是"稀疏"数据,我们可以稍后解决。
要返回星期几('星期日','星期一'等),您可以使用DATE_FORMAT
功能。为了获得那些有序的,我们需要包含一个整数值0到6,或1到7.我们可以在该表达式上使用ORDER BY
子句来获取按我们想要的顺序返回的行。
获得"小时"在顶部,我们可以在SELECT列表中使用有条件地增加计数的表达式。
假设您的时间戳列名为ts
,并假设您想要从2014年开始提取所有行,我们从这样开始:
SELECT DAYOFWEEK(t.ts)
, DATE_FORMAT(t.ts,'%W')
FROM mytable t
WHERE t.ts >= '2014-01-01'
AND t.ts < '2015-01-01'
GROUP BY DAYOFWEEK(t.ts)
ORDER BY DAYOFWEEK(t.ts)
(我需要检查MySQL文档, WEEKDAY
和DAYOFWEEK
是真正相似的,但我们想要一个返回星期日最低值,星期六最高值...我想我们想要DAYOFWEEK
,以后很容易修复
&#34;技巧&#34;现在是顶部的列。
我们可以提取&#34;小时&#34;使用DATE_FORMAT()
函数,HOUR()
函数或EXTRACT()
函数从时间戳开始......随意选择。
如果时间戳在指定的小时内,我们想要的表达式将返回1,否则返回零。然后,我们可以使用SUM()聚合来计算1.布尔表达式为TRUE返回值1,为FALSE返回0。
, SUM( HOUR(t.ts)=0 ) AS `h0`
, SUM( HOUR(t.ts)=1 ) AS `h1`
, SUM( HOUR(t.ts)=2 ) AS `h2`
, '...'
, SUM( HOUR(t.ts)=22 ) AS `h22`
, SUM( HOUR(t.ts)=23 ) AS `h23`
布尔表达式也可以求值为NULL,但由于我们有一个谓词(即WHERE子句中的条件)确保ts
不能为NULL,所以不会一个问题。
我们可以遇到的另一个问题(如前所述)是&#34; 稀疏&#34;数据。为了说明这一点,请考虑如果没有行具有ts
Monday
值,则会发生什么(使用我们的查询)。发生的事情是我们在Monday
的结果集中没有获得一行。如果确实发生了一行&#34;缺失&#34;对于Monday
(或一周中的任何一天),我们确实知道&#34;缺少&#34;的所有小时数。 Monday
行将全部为零。