2013-04-18 58 views
1

我期待從零星基礎上發生的事件日誌中獲取值,並在事件之間的所有日期擴展這些值。例如:左側連接產生內部連接結果 - PostgreSQL

全系列可能看起來像......

2013-01-01 
2013-01-02 
2013-01-03 
2013-01-04 
2013-01-05 

但在事件日誌看起來像......

2013-01-01 | value_1 
2013-01-04 | value_2 

期望的最終結果如下...

2013-01-01 | value 1 
2013-01-02 | value 1 
2013-01-03 | value 1 
2013-01-04 | value 2 
2013-01-05 | value 2 

作爲解決方案,我試圖生成一系列完整的日期,並將選擇性事件日誌日期加入到完整系列中,然後用所需的值填充NULL值,但是我遇到了左連接產生內連接結果的問題。

select 
days.date, 
e.value 
from 
--Generate table for dates 
    (select 
    row_number() over(), 
    generate_series::date as date 
    from 
     generate_series('2009-01-01',current_date + interval '100 days',interval '1 day')) days 
--Combine actual change log 
left join 
    (select 
    value, 
    event_date 
    from event_table 
    where type = 'desired_type') e 
     on days.date = e.event_date 

我的結果集是不是1669行全日期,但只有少數e.value,而只是一排的每個非空days.date,e.value組合。在視覺上,而不是...

2009-01-01 | value 1 
2009-01-02 | NULL 
2009-01-03 | NULL 
2009-01-04 | value 2 
2009-01-05 | NULL 
... 

...我得到...

2009-01-01 | value 1 
2009-01-04 | value 2 
... 

,我期望我們用一個內部聯接,而不是一個左連接從幾天到E。

+1

這就是你所有的查詢?你沒有'where'條款嗎? –

回答

1

LEFT JOIN應該只是工作。

可以大大簡化整個查詢:

SELECT d.day, e.value 
FROM (
    SELECT rn, '2009-01-01'::date + rn AS day 
    FROM generate_series(0, (now()::date - '2009-01-01'::date) + 100) AS g(rn) 
    ) d 
LEFT JOIN event_table e ON e.event_date = d.day AND e.type = 'desired_type' 

然而,僅僅在幾天前有人問一個非常類似的問題。它有很多很好的答案(包括我可能會添加的)。你會發現完整的解決方案在那裏你的問題:
How do I write a join with this unusual matching criteria?

+0

我可能會使用另一個線程中提出的lead()方法,但我仍然困惑於爲什麼「LEFT JOIN應該正常工作」。 – Nick

+1

@Nick因爲您發佈的查詢應該給出預期的結果。當然你正在隱藏一個'where'子句,將它變成一個'inner join'。 –

+0

我期望的結束查詢將在where子句中有內容(我只想爲特定帳戶提供結果),但是,我尚未構建這些內容,並且只是對生成的系列和事件日誌表進行評估。 – Nick