2016-06-06 7 views
0

이벤트 테이블과 트랜잭션 로그가 있습니다. 그리고 각 이벤트의 총 수익을 하나의 SQL로 계산합니다. 어떻게해야하는지 알려줄 수 있습니까?
트랜잭션 테이블에 100,000 개가 넘는 로그가 있습니다.postgreSQL에서 다른 테이블의 데이터 사용

event_table :

Event_id | start_date | end_date 
------------------------ 
11111 | 2013-01-04 | 2013-01-05 
11112 | 2013-01-08 | 2013-01-10 
11113 | 2013-01-11 | 2013-01-12 
11114 | 2013-01-15 | 2013-01-18 
11115 | 2013-01-19 | 2013-01-21 
11116 | 2013-01-22 | 2013-01-24 
11117 | 2013-01-26 | 2013-01-29 

transaction_log :

나는 다음과 같이 SQL을 사용하려고
id | name | time_created | Cost 
    ------------------------ 
    1 | michael | 2013-01-04 | 1 
    2 | michael | 2013-01-08 | 4 
    3 | mary | 2013-01-11 | 5 
    4 | john | 2013-01-15 | 2 
    5 | michael | 2013-01-19 | 3 
    6 | mary | 2013-01-22 | 2 
    7 | john | 2013-01-26 | 4 

하지만 작동하지 않습니다.

select 
     event_table.id, 
     (select sum(Cost) 
     from transaction_log 
     where date(time_created) between transaction_log.start_date and transaction_log.end_date) as revenue 
from event_table 
+3

당신은 DTO가 작동하지 않는 _how_, 당신이 등을 기대하고 있었는지 설명해야합니다. – renemilk

+0

다른 테이블에 재고가있는 기간을 사용하여 하나의 테이블 데이터를 합산하려고했습니다. 나는 "join on (xx 사이의 xx)"을 사용할 수 있다는 것을 결코 깨닫지 못했습니다. 해결되었습니다. 고마워요! –

답변

0

필드 start_dateend_dateevent_table에서이기 때문에 그것은 실패하지만 당신은 transaction_log.start_datetransaction_log.end_date로 진술하고 있습니다. 이것은 작동합니다 :

select 
     event_table.id, 
     (select sum(Cost) 
     from transaction_log 
     where date(time_created) between event_table.start_date and event_table.end_date) as revenue 
from event_table 

이미 날짜 데이터 형식의 경우 날짜 (date(time_created))로 time_created 캐스팅 할 필요가 없습니다. 위와 같은 쿼리를 실행할 때

성능 또한
select 
     event_table.id, 
     (select sum(Cost) 
     from transaction_log 
     where time_created >= event_table.start_date::timestamptz and time_created < (event_table.end_date+1)::timestamptz) as revenue 
from event_table 

는, PostgreSQL의 메인의 각 행에 대해 하위 쿼리를 실행 : 그렇지 않으면, TIME_CREATED 경우는 성능을 위해 당신이하고 고려할 수, 타임 스탬프 또는 timestamptz입니다 쿼리 (이 경우 event_table 테이블). 가입 및 사용하여 GROUP BY 더 나은 결과를 제공 일반적으로됩니다

select e.id, sum(l.Cost) as revenue 
from event_table e 
join transaction_log l ON (l.time_created BETWEEN e.start_date AND e.end_date) 
group by e.id 
+0

마지막 쿼리를 사용했는데 완벽하게 작동합니다. 나는 와 같은 쿼리를 사용하지 않았다. b (a.aa와 a.ab 사이의 b.bb) 정말 놀랍다. 고마워! –

+0

@ YuanGao 만족스럽게 답이 나면 더 이상 도움을 줄 사람이 없도록 질문에 답을 표시하십시오. –

관련 문제