2014-03-01 83 views
2

我想每個日曆周都返回每週的條目數。我當前的代碼:每週的Postgres條目,每週

SELECT COUNT(*) AS count, date_trunc('week', occured_on) AS week 
from incidents 
GROUP BY date_trunc('week', occured_on) 
ORDER BY date_trunc('week', occured_on); 

這將返回:

count |  week   
-------+--------------------- 
    1 | 2009-09-28 00:00:00 
    2 | 2009-10-19 00:00:00 
    6 | 2009-10-26 00:00:00 
    3 | 2009-11-02 00:00:00 
    6 | 2009-11-09 00:00:00 
    22 | 2009-11-16 00:00:00 

跳過一個星期在沒有事故發生。如何獲得該周的0,顯示每個日曆周的條目總數,而不是每週發生一次事件?

回答

0
SELECT my_weeks.week_number AS week , IFNULL(i.count,0) 
from 
(
SELECT generate_series (1,54,1) AS week_number 
) my_weeks 
LEFT OUTER JOIN 
(
    SELECT COUNT(*) AS count, date_trunc('week', occured_on) AS week 
    from incidents 
    GROUP BY date_trunc('week', occured_on) 
) i 
ON my_weeks.week_number = i.week 
ORDER BY my_weeks.week_number ; 
6

您可以通過生成一系列星期,然後聚集之前,使用left join做到這一點。以下產生使用CTE的系列。這不是必需的,但我認爲它顯示了正在使用的邏輯:

with dates as (
     select min(date_trunc('week', occured_on)) as startw, 
      max(date_trunc('week', occured_on)) as endw 
     from incidents 
    ), 
    weeks as (
     select generate_series(startw, endw, '7 days') as week 
     from dates 
    ) 
select w.week, count(i.occured_on) 
from weeks w left outer join 
    incidents i 
    on date_trunc('week', i.occured_on) = w.week 
group by w.week; 

SQL小提琴是here

+0

我已經看到這個問題的最好和最可讀的解決方案。謝謝! – newUserNameHere