2017-09-12 1 views
0

私はSQL Server 2008を使用しています。私はこのように2つのテーブルを持っています。日付を一致させるのではなく履歴を保存するように、あるテーブルのデータが別のテーブルに結合されるようにデータを平坦化するにはどうすればよいですか?

表Aには、次のようなものがあります。

ID Date  Data1 Data2 
1 2/18/2017 X  y 
1 3/22/2017 a  b 

表Bには、以下のようなものがあります。

ID Date  Data3 Data4 
1 2/20/2017 c  d 
1 2/21/2017 f  g 

私は後だ期待される結果は、接合後、次のデータテーブルでありますinfo:

ID Date  Data1 Data2 Data3 Data4 
1 2/18/2017 x  y  null null 
1 2/20/2017 x  y  c  d 
1 2/21/2017 x  y  f  g 
1 3/22/2017 a  b  f  g 

したがって、テーブルAにその日のレコードがない場合、それはpuです基本的には他のテーブルから最新のレコードを取り出す。私は外部結合を使用しようとしましたが、データが欠落しているときに、他のテーブルから最新の既知のレコードを引き出すわけではありません。

+1

どのdbmsを使用していますか? –

+0

テーブルAからのID、日付、データ1、データ2、データ3、データ4の選択TableA.ID = TableB.ID where TableA.ID = 1; –

+0

SQL Server 2008. – Snafu64

答えて

0

完全アウタージョインで行を取得します(USING句は大丈夫ですが、SQL Serverにはこれがありません)。その後、元の行から履歴を取得するためにLAST_VALUEを適用したいが、SQL Serverの実装にはIGNORE NULLSという句がないため、動作しない。したがって、結合された行を反復的に(再帰的なクエリ)実行する必要があります。

それとも私たちはかなりunsophisticatedly日付を選択してこれらの日付に以下の最後のレコードを結合することができます。

select 
    dates.date, 
    last_a.data1, 
    last_a.data2, 
    last_b.data3, 
    last_b.data4 
from 
(
    select date from a 
    union 
    select date from b 
) dates 
outer apply 
(
    select top(1) a.data1, a.data2 
    from a 
    where a.date <= dates.date 
    order by a.date desc 
) last_a 
outer apply 
(
    select top(1) b.data3, b.data4 
    from b 
    where b.date <= dates.date 
    order by b.date desc 
) last_b; 

を、これが遅すぎる場合は、アプローチを代わりに完全外部結合を試してみてください。それは速くなければなりません。

+0

ありがとうThorsten。私は、日付テーブルにIDを追加し、date.iD = last_a.idの最後のテーブルに句を追加するだけで、そのIDに関連付けられた日付を取得するように変更しました。 – Snafu64

関連する問題