SQL查询,根据时间戳选择按小时(col)和工作日(行)分组的值

时间:2015-06-02 12:42:25

标签: mysql group-by heatmap weekday

我搜索了这个问题的SO,发现了一些类似的帖子但是无法适应我的需求。

我有一个带有服务器请求的数据库,因为它永远存在,每个都有一个时间戳,我试图想出一个允许我创建热矩图(CCC HeatGrid)的查询。

sql查询结果必须表示按每个工作日的每小时分组的服务器负载。

像这样:Example table

我只需要SQL查询,我知道如何创建图表。

谢谢,

1 个答案:

答案 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文档,WEEKDAYDAYOFWEEK是真正相似的,但我们想要一个返回星期日最低值,星期六最高值...我想我们想要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行将全部为零。