2016-03-11 63 views
0

在我的表中,我有一些條目 - 在表格的日期列 - 不會比2016-01-04(2016年1月4日)更舊。 現在我想進行一個查詢,它或多或少地計算具有特定日期值的行數,但我希望此查詢能夠返回表中不存在日期的0計數。包含來自cte的值,當它不匹配

我有這樣的:

with date_count as (select '2016-01-01'::date + CAST(offs || ' days' as 
interval) as date from generate_series(0, 6, 1) AS offs) select 
date_count.date, count(allocation_id) as packs_used from medicine_allocation, 
date_count where site_id = 1 and allocation_id is not null and timestamp 
between date_count.date and date_count.date + interval '1 days' group by 
date_count.date order by date_count.date; 

這無疑給了我在我的表的日期的一個很好的聚合視圖,但因爲沒有行從2016年1月4日之前,他們不會在結果顯示:

"2016-01-04 00:00:00";1 
"2016-01-05 00:00:00";2 
"2016-01-06 00:00:00";4 
"2016-01-07 00:00:00";3 

我想這樣的:

"2016-01-01 00:00:00";0 
"2016-01-02 00:00:00";0 
"2016-01-03 00:00:00";0 
"2016-01-04 00:00:00";1 
"2016-01-05 00:00:00";2 
"2016-01-06 00:00:00";4 
"2016-01-07 00:00:00";3 

我也試過在CTE右連接,但這種收益率相同的結果。我不能完全掌握如何做到這一點...有什麼幫助嗎?

最佳, 劍鋒

回答

1

你只需要一個left join

with date_count as (
     select '2016-01-01'::date + CAST(offs || ' days' as 
interval) as date 
     from generate_series(0, 6, 1) AS offs 
    ) 
select dc.date, count(ma.allocation_id) as packs_used 
from date_count dc left join 
    medicine_allocation ma 
    on ma.site_id = 1 and ma.allocation_id is not null and 
     ma.timestamp between dc.date and dc.date + interval '1 days' 
group by dc.date 
order by dc.date; 

建議的一句話:FROM子句中決不使用逗號。 總是使用明確的JOIN語法。

您還會注意到,where條件已移至ON條款。這是必要的,因爲他們在第二張桌子上。

+0

優秀!!非常感謝。我自己非常親密(用我的右連接),但是你的幫助使我免於很多挫折:)我可以問爲什麼不使用逗號,但只加入語法? –

+0

@JanusEngstrøm。 。 。 'JOIN'語法更強大。沒有理由使用逗號(可以使用'CROSS JOIN'來代替)。大多數人發現邏輯更容易跟隨'JOIN'。 –