2012-08-01 59 views
1

我寫了一個小的PostgreSQL查詢,可以幫助我在兩個特定日期內每天每小時執行一次的作業總量 - 例如,在2012年2月2日至2012年3月3日之間執行的所有工作從小時開始,以2月2日給出的小時爲開始,並以3月3日給出的小時結束,我注意到此查詢不打印0計數的行 - 在該時間間隔內沒有執行任務例如於2012年2月21日下午5點至6點之間。我怎樣才能使這也返回結果(行)0計數?代碼如下:如何使這個查詢也返回0計數值的行?

SELECT date_trunc('hour', executiontime), count(executiontime) 
    FROM mytable 
WHERE executiontime BETWEEN '2011-2-2 0:00:00' AND '2012-3-2 5:00:00' 
GROUP BY date_trunc('hour', executiontime) 
ORDER BY date_trunc('hour', executiontime) ASC; 

在此先感謝。

+0

你需要一個數字表生成每個小時爲一列,然後外連接到'mytable'得到計數。 – dotjoe 2012-08-01 14:19:06

+0

@dotjoe會這樣做,謝謝 – sm90901 2012-08-01 14:20:11

回答

1
 -- CTE to the rescue!!! 
WITH cal AS (
     SELECT generate_series('2012-02-02 00:00:00'::timestamp , '2012-03-02 05:00:00'::timestamp , '1 hour'::interval) AS stamp 
     ) 
, qqq AS (
     SELECT date_trunc('hour', executiontime) AS stamp 
     , count(*) AS zcount 
     FROM mytable 
     GROUP BY date_trunc('hour', executiontime) 
     ) 
SELECT cal.stamp 
     , COALESCE (qqq.zcount, 0) AS zcount 
FROM cal 
LEFT JOIN qqq ON cal.stamp = qqq.stamp 
ORDER BY stamp ASC 
     ; 
+0

這給出了以下語法錯誤錯誤:在「WITH CAL」處或附近的語法錯誤第8行:WITH CAL AS(儘管與PostgreSQL文檔中的CTE示例相同,出於某種原因) – sm90901 2012-08-02 05:21:46

+0

,它在這裏工作。你有一個版本低於8.4? – wildplasser 2012-08-02 07:44:44

+0

我有8.3,應該是問題。謝謝。 – sm90901 2012-08-02 08:08:20

0

Look this。想法是在此期間生成帶有日期的數組或表格,並與作業執行表一起使用。