左连接产生内部连接结果 - PostgreSQL

时间:2013-04-18 23:10:59

标签: sql postgresql left-join greatest-n-per-group

我希望从偶尔发生的事件日志中获取值,并在事件之间的所有日期扩展这些值。例如:

完整系列可能看起来像......

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,而是每个非NULL 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
...

我希望这可以通过内部联接,而不是从几天到左边的左联接。

1 个答案:

答案 0 :(得分: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?