2016-08-24 2 views
1

내 테이블 중 하나에 created_date (시간 소인)이 있는데, 그 테이블에는 프로젝트의 duration 열이 있으며, first_day_of_month 열만있는 다른 테이블과 조인해야합니다. 매월 첫날 및 기타 관련 정보를 제공합니다.캘린더 테이블을 사용하여 데이터의 내역보기를 생성하십시오.

표 1

id project_id created_date duration 
1  12345  01/01/2015  10 
2  12345  20/10/2015  11 
3  12345  10/04/2016  13 
4  12345  10/08/2016  15 

표 2

project_id month_start_date 
12345  01/01/2015  
12345  01/02/2015  
12345  01/03/2015  
12345  01/04/2015  
... 
12345  01/08/2016  

예상 결과

project_id month_start_date duration 
12345  01/01/2015   10 
12345  01/02/2015   10 
... 
12345  01/10/2015   11 
12345  01/11/2015   11 
... 
12345  01/04/2016   13 
12345  01/05/2016   13 
12345  01/06/2016   13 
... 
12345  01/08/2016   15 

내가 할 수 t되고 싶어요 o 두 번째 표에 나열된 데이터를 역사적으로 표시합니다. 따라서 기본적으로 month_start_date과 관련된 동일한 duration을 반환하는 쿼리를 사용하면 dateadd(month,datediff(month,0,created_date),0) = first_day_of_month이 충족 될 때까지 값이 반복됩니다. 이에

select table2.project_name, 
     table2.month_start_date, 
     table1.duration, 
     table1.created_date 
from table1 left outer join table2 
    on table1.project_id=table2.project_id 
where dateadd(month,datediff(month,0,table1.created_date),0)<=table2.month_start_date 
group by table2.project_name,table2.month_start_date,table1.duration,table1.created_date 
order by table2.month_start_date asc 

하지만 반복 얻을 기록 : 나는

project_id month_start_date duration 
12345  01/01/2015   10 
12345  01/02/2015   10 
... 
12345  01/10/2015   10 
12345  01/10/2015   11 
... 
12345  01/04/2016   10 
12345  01/04/2016   11 
12345  01/04/2016   13 
... 
12345  01/08/2016   10 
12345  01/08/2016   11 
12345  01/08/2016   13 
12345  01/08/2016   15 

누군가가 도와 드릴까요

납니다

결과

이 내 쿼리입니다?

감사합니다.

+1

샘플 테이블 데이터와 예상되는 결과를 추가하십시오. 또한 현재 쿼리 시도를 보여주십시오! – jarlh

+0

현재 가지고있는 테이블의 스키마가 도움이된다고 덧붙일 것입니다. –

+0

내가 게시물을 편집했습니다. – Synamoon

답변

0

나는 CROSS/OUTER APPLY 연산자를 사용합니다.

다음은 가능한 변형입니다. 캘린더 테이블 Table2 (각 달)의 각 행에 대해 CROSS APPLY 내부의 내부 상관 하위 쿼리는 Table1에서 하나의 행을 찾습니다. month_start_date에 1 개월을 더한 뒤 project_id과 같은 행이 있고 첫 번째 행은 created_date입니다.

SELECT 
    Table2.project_id 
    ,Table2.month_start_date 
    ,Durations.duration 
FROM 
    Table2 
    CROSS APPLY 
    (
     SELECT TOP(1) Table1.duration 
     FROM Table1 
     WHERE 
      Table1.project_id = Table2.project_id 
      AND Table1.created_date < DATEADD(month, 1, Table2.month_start_date) 
     ORDER BY Table1.created_date DESC 
    ) AS Durations 
; 

Table1(project_id, created_date) include (duration)에 인덱스가 있는지 확인합니다. 그렇지 않으면 성능이 떨어집니다.

+1

저는 SQL 2012를 사용하고 있으며 Lateral join을 인식하지 못하는 것 같습니다. 맞습니까? 어떤 다른 해결 방법을 사용할 수 있습니까? – Synamoon

+0

@Synamoon, 당신은 SQL Server가 아닌 Postgres로 태그를 붙였습니다. 그래서 Postgres에 대한 답을 얻었습니다. 측면 조인을위한 SQL Server의 구문은 'CROSS APPLY'입니다. 질문을 다시 추적하고 SQL Server 구문과 함께 응답을 추가합니다. –

관련 문제