2013-04-18 3 views
1

저는 산발적으로 발생하는 이벤트 로그에서 값을 가져 와서 이벤트 사이의 모든 날짜에이 값을 확장하려고합니다. 예를 들어 :왼쪽 Join Yielding 내부 조인 결과 - 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 있지만, 각 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

그게 전부입니까? '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

@ 닉 게시 된 쿼리가 예상 한 결과를 제공해야하기 때문입니다. 물론'where' 절을 숨겨서 내부 조인으로 바꾸고 있습니다. –

+0

원하는 최종 쿼리에 where 절에 내용이 있습니다 (특정 계정에 대해서만 결과를 제공하고 싶습니다). 그러나 아직 생성하지 않았으며 생성 된 시리즈 및 이벤트 로그 테이블을 평가하는 것입니다. – Nick

관련 문제