我已经搜索了这个问题,并发现了一些类似的帖子,但是无法适应我的需求。
我一直以来都有一个包含服务器请求的数据库,每个请求都有一个时间戳,并且我试图提出一个查询,该查询使我可以创建一个热矩阵图(CCC HeatGrid)。
sql查询结果必须表示按每个工作日的每小时分组的服务器负载。
像这样:示例表
我只需要SQL查询,我知道如何创建图表。
谢谢,
那些看起来像是行的“计数”。
问题之一是“稀疏”数据,我们稍后可以解决。
要返回星期几(“星期日”,“星期一”等),可以使用该DATE_FORMAT
函数。为了使这些顺序排序,我们需要包括一个0到6或1到7的整数。我们可以ORDER BY
在该表达式上使用一个子句来获取按所需顺序返回的行。
为了使顶部的“小时”更短,我们可以使用SELECT列表中的表达式来有条件地增加计数。
假设您的timestamp列名为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
,很容易在以后进行修复)
现在,“技巧”是顶部的各列。
我们可以使用DATE_FORMAT()
函数,HOUR()
函数或EXTRACT()
函数从时间戳中提取“小时” ...任您选择。
如果时间戳在指定的小时内,我们想要的表达式将返回1,否则返回0。然后,我们可以使用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,所以不会有问题。
我们可能遇到的另一个问题(如我之前提到的)是“稀疏”数据。为了说明这一点,请考虑如果没有行具有ats
值的情况(对于我们的查询)会发生什么Monday
。发生的情况是我们没有在的结果集中出现任何一行Monday
。如果确实发生了某行Monday
(或一周中的任何一天)“丢失”的情况,我们确实知道“丢失”Monday
行中的所有小时计数都将为零。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句