我搜索了這個問題,發現有點類似的帖子,但無法適應我的需求。根據時間戳選擇按小時(col)和工作日(row)分組的值的SQL查詢
我有一個數據庫與服務器請求,因爲永遠,每個人都有一個時間戳,我試圖想出一個查詢,允許我創建一個heatmatrix圖表(CCC HeatGrid)。
sql查詢結果必須表示按每個工作日的每個小時分組的服務器負載。
像這樣:Example table
我只需要在SQL查詢,我知道如何創建圖表。
謝謝
我搜索了這個問題,發現有點類似的帖子,但無法適應我的需求。根據時間戳選擇按小時(col)和工作日(row)分組的值的SQL查詢
我有一個數據庫與服務器請求,因爲永遠,每個人都有一個時間戳,我試圖想出一個查詢,允許我創建一個heatmatrix圖表(CCC HeatGrid)。
sql查詢結果必須表示按每個工作日的每個小時分組的服務器負載。
像這樣:Example table
我只需要在SQL查詢,我知道如何創建圖表。
謝謝
那些看起來像行的「罪狀」。
其中一個問題是「稀疏」數據,我們稍後可以解決。
要返回星期幾('星期日','星期一'等),可以使用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
,很容易,以後再修改)
的「絕招」現在是列在頂部。
我們可以使用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
不能爲空,這不會是一個問題。
我們可以遇到的另一個問題(如前面提到的)是「稀疏」數據。爲了說明這一點,考慮如果沒有行的ts
值爲Monday
會發生什麼(使用我們的查詢)。結果是,我們沒有在Monday
的結果集中獲得一行。如果在Monday
(或一週中的任何一天)發生一行「缺失」,我們確實知道「缺失」Monday
行中的所有小時計數都將爲零。