2015-06-02 11 views
0

我搜索了這個問題,發現有點類似的帖子,但無法適應我的需求。根據時間戳選擇按小時(col)和工作日(row)分組的值的SQL查詢

我有一個數據庫與服務器請求,因爲永遠,每個人都有一個時間戳,我試圖想出一個查詢,允許我創建一個heatmatrix圖表(CCC HeatGrid)。

sql查詢結果必須表示按每個工作日的每個小時分組的服務器負載。

像這樣:Example table

我只需要在SQL查詢,我知道如何創建圖表。

謝謝

回答

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,很容易,以後再修改)

的「絕招」現在是列在頂部。

我們可以使用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行中的所有小時計數都將爲零。

相關問題