2016-08-24 5 views
1

(タイムスタンプ)は私のテーブルの1つにあり、それにはプロジェクトの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 

私ができるトンになりたいですo第2の表にリストされたデータを歴史的に提示する。したがって、基本的には、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オペレータを使用します。

これは1つの可能な変形です。カレンダーテーブルTable2(各月)の各行について、CROSS APPLY内の内部相関サブクエリは、Table1から1つのローを検出します。 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を使用していますが、それは横組を認識していないようですが、これは正しいですか?他にどのような回避策を使用できますか? – Synamoon

+0

@Synamoon、あなたはあなたの質問をSQL ServerではなくPostgresとしてタグ付けしました。そうすれば、Postgresの答えが得られます。横方向結合のSQL Serverの構文は 'CROSS APPLY'です。私はあなたの質問に答えて、SQL Server構文で答えを追加します。 –

関連する問題