2

私は2つのテーブルを持っています。それらをテーブルAとBと呼びましょう:-

表 A は次のようになります。

   A.Num1       |   A.Num2      |   A.Date      
   12345        |   38170       |   28/05/2013      
   12345        |   38170       |   29/05/2013      
   12345        |   38170       |   31/05/2013      
   12345        |   38170       |   01/06/2013      
   12345        |   38170       |   03/06/2013      
   12345        |   38170       |   04/06/2013  
   12345        |   38170       |   04/06/2013          
   12345        |   38170       |   07/06/2013  

表 2 (B) は次のようになります。

    B.Num1      |   B.Num2      |   B.Status    |   B.Date
    12345       |   38170       |   New         |   28/05/2013  
    12345       |   38170       |   Closed      |   31/05/2013  
    12345       |   38170       |   Reopened    |   04/06/2013

出力としてこのようなテーブルが必要です - 基本的に、テーブル A のすべての行 + テーブル B のステータスが含まれている必要があります

    Num1        |   Num2        |   Status      |   Date
    12345       |   38170       |   New         |   28/05/2013      
    12345       |   38170       |   New         |   29/05/2013      
    12345       |   38170       |   Closed      |   31/05/2013      
    12345       |   38170       |   Closed      |   01/06/2013      
    12345       |   38170       |   Closed      |   03/06/2013      
    12345       |   38170       |   Reopened    |   04/06/2013  
    12345       |   38170       |   Reopened    |   04/06/2013      
    12345       |   38170       |   Reopened    |   07/06/2013      

また、プロシージャーではなく、単純な SQL ステートメントを使用することをお勧めします。

前もって感謝します。明確化のために親切にコメントしてください

インドル

アップデート

テーブル B の 2 つの行のステータスが変更されたが、同じ日付の場合、結合で一貫性のない値が得られます。

例を見てみましょう:

A と B という 2 つのテーブルがあります。これらはかなり大きなテーブルで、特定の情報が文書化されています。テーブル A は、数日ごとにデータをスキャンして文書化しますが、ステータス列がありません。変更がある場合、テーブル B はステータス列を含む新しいエントリを取得します。これら 2 つを照合し、B に対応するテーブル A の各エントリのステータスを取得する必要があります。

表 B

Id  | Num1  | Num2  | CreatedOn   | Status
100 | 12345 | 38170 | 28/05/2013  | New
150 | 12345 | 38170 | 28/05/2013  | Closed
200 | 12345 | 38170 | 31/05/2013  | Reopened
250 | 12345 | 38170 | 04/06/2013  | Closed

表 A

Id  | Num1  | Num2  | CreatedOn
55  | 12345 | 38170 | 28/05/2013
99  | 12345 | 38170 | 30/05/2013
145 | 12345 | 38170 | 31/05/2013
192 | 12345 | 38170 | 31/05/2013
223 | 12345 | 38170 | 04/06/2013

望ましい出力

Id  | Num1  | Num2  | CreatedOn   | Status
55  | 11552 | 38170 | 28/05/2013  | New
99  | 11552 | 38170 | 30/05/2013  | Closed
145 | 11552 | 38170 | 31/05/2013  | Reopened
192 | 11552 | 38170 | 31/05/2013  | Reopened
223 | 11552 | 38170 | 04/06/2013  | Closed

代わりに、次のようになります: (Jeffrey Kamp の返信を使用)

Id  | Num1  | Num2  | CreatedOn   | Status
55  | 11552 | 38170 | 28/05/2013  | Closed
99  | 11552 | 38170 | 30/05/2013  | Closed
145 | 11552 | 38170 | 31/05/2013  | Reopened
192 | 11552 | 38170 | 31/05/2013  | Reopened
223 | 11552 | 38170 | 04/06/2013  | Closed

そしてこれ:(返信2を使用 - マーク・バニスター)

Id  | Num1  | Num2  | CreatedOn   | Status
55  | 11552 | 38170 | 28/05/2013  | New
99  | 11552 | 38170 | 30/05/2013  | New
145 | 11552 | 38170 | 31/05/2013  | Reopened
192 | 11552 | 38170 | 31/05/2013  | Reopened
223 | 11552 | 38170 | 04/06/2013  | Closed

テーブル B には同じ日 (28/05/13) に 2 つのエントリがあるため、明らかにレコード Id-55 は新規またはクローズのいずれかになります。これを行う方法は?

4

2 に答える 2

4

試す:

select a.Num1, a.Num2, a."Date", b.Status
from TableA a
join (select TableB.*, 
             lead("Date",1) over (partition by Num1, Num2 
                                  order by "Date") NextDate
      from TableB) b
  on a.Num1 = b.Num1 and 
     a.Num2 = b.Num2 and 
     a."Date" >= b."Date" and 
     a."Date" < coalesce(b.NextDate,a."Date"+1)

ここでSQLFiddle 。

于 2013-06-12T07:32:27.197 に答える