2012-08-01 86 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。想法是在此期间生成带有日期的数组或表格,并与作业执行表一起使用。