2014-10-27 59 views
0

我的目標是創建一個SQL查詢計數在一定的時間範圍內的所有物品(如5分鐘)SQL進行分組按時間範圍與空幀

這是我到目前爲止的代碼:

SELECT FROM_UNIXTIME(FLOOR(timestamp_stop/5*60)*(5*60), '%h:%i') AS timekey, timestamp_stop, count(item) AS performance 
FROM task 
WHERE done = 1 
GROUP BY timekey 
ORDER BY timestamp_stop ASC 

這很好用,但不包括數據庫中沒有任何記錄的時間範圍。 我想也得到這些0計數,直到當前時間。

目前我沒有簡單/優雅的解決方案。有任何想法嗎?

在php中的一些小後處理也是可能的。

回答

0

如果有這樣的時間框架,但where條款過濾掉的記錄,你可以這樣做:

SELECT FROM_UNIXTIME(FLOOR(timestamp_stop/5*60)*(5*60), '%h:%i') AS timekey, 
     timestamp_stop, 
     sum(item is not null and done = 1) AS performance 
FROM task 
GROUP BY timekey 
ORDER BY timestamp_stop ASC; 

如果您還是有差距,那麼你需要生成包含一個表(或子查詢)您想要並使用的時間表列表left join

編輯:

子查詢不愉快。你必須列出所有的時間值。例如:

SELECT q.timekey, t.timestamp_stop, coalesce(t.performance, 0) as performance 
FROM (SELECT '00:00' as timekey UNION ALL 
     SELECT '00:05' UNION ALL 
     . . . 
    ) q LEFT JOIN 
    (SELECT FROM_UNIXTIME(FLOOR(timestamp_stop/5*60)*(5*60), '%h:%i') AS timekey, 
      timestamp_stop, 
      COUNT(item) AS performance 
     FROM task 
     WHERE done = 1 
     GROUP BY timekey 
    ) t 
    ON t.timekey = q.timekey 
ORDER BY timestamp_stop ASC; 
+0

謝謝!差距不是由於where子句,而是由於缺少任何條目。一個具有所有時間框架的子查詢怎麼可能是?帶額外桌子的營養不是很優雅,因爲我想看到所有的時間框架到現在或某個時間點。 – tobawo 2014-10-27 23:39:48

0

正如Gordon提到的,您可能需要一個輔助表作爲所有5分鐘間隔的基礎。我已經做了類似的查詢使用MySQL變量自我構建。

select 
     YourTable.WhateverFields 
    from 
     (select 
      @startTime RangeStart, 
      @startTime := date_add(@startTime, interval 5 MINUTE) RangeEnd 
      from 
       (select @startTime := '2014-10-20') sqlvars, 
       AnyTableThatHasAsManyDaysYouExpectToReport 
      limit 
       12 * numberOfHoursYouNeed * numberOfDaysYouNeed) DynamicTimeRange 
     LEFT JOIN YourTable 
      on YourTable.DateTimeField >= DynamicTimeRange.RangeStart 
      AND YourTable.DateTimeField < DynamicTimeRange.RangeEnd 

因此,在這個例子中,最裏面的一個變量「startTime」到2014年10月20日,默認爲12:00:00。隨後,一出從創建一個rangeStart和rangeEnd的和組的兩列可能看起來像一個結果......

RangeStart   RangeEnd 
2014-10-20 00:00 2014-10-20 00:05 
2014-10-20 05:00 2014-10-20 00:10 
2014-10-20 10:00 2014-10-20 00:15 
2014-10-20 05:00 2014-10-20 00:20 
2014-10-20 20:00 2014-10-20 00:25 

表參考「AnyTableThatHasAsManyDaysYouExpectToReport」就是這樣......在你的數據庫的任何表它的記錄數量至少與無數小時和數天需要5分鐘的時間間隔相同。如果您需要1天價值= 12條記錄* 5分鐘= 1小時* 24小時= 24 * 12 =需要288條記錄。如果你想要一個星期,那麼就這樣......乘以7,所以我的樣本只是有地方持有人來幫助澄清意圖......

但是,通過LEFT JOIN,您可以獲得所有間隔.. 。