2017-11-27 12 views
0

以下のシナリオを処理するために、クエリのヘルプが必要です。履歴処理シナリオの問題

以下のレコードがアクティブである:

以下
ID   start_dt  status end_dt 
------------------------------------------------- 
18,593,122 1/15/07 14:38 A  12/11/07 8:45 
18,593,122 12/11/07 8:45 C  12/11/07 8:45 
18,593,122 12/11/07 8:45 A  11/13/11 0:00 
18,593,122 11/13/11 0:00 C  12/26/11 10:36 
18,593,122 12/26/11 10:36 A  ? 

が閉じている:

ID   start_dt  status end_dt 
------------------------------------------------- 
18,593,122 1/15/07 14:38 A  12/11/07 8:45 
18,593,122 12/11/07 8:45 C  ? 

私はレコードが正しく終了されていないテーブル内のレコードを挿入する必要があります。クローズドレコードが不足している上記のレコードで

ID   start_dt  status end_dt 
------------------------------------------------- 
18,593,122 1/15/07 14:38 A  12/11/07 8:45 

: がexについて以下のようなレコードがあります。

私はそのようなレコードを特定し、テーブルに挿入する必要があります。

以下のサンプルが影響を受けます。扱うことができないシナリオの下

10,866 7/29/96 0:01 A  12/27/03 14:16 
10,866 7/25/00 0:01 A  8/20/00 23:59 
10,866 8/20/00 23:59 C  10/2/02 13:00 
10,866 10/2/02 13:00 A  7/25/04 14:11 
10,866 12/27/03 14:16 C  7/25/04 14:11 
10,866 7/25/04 14:11 C  7/25/04 14:11 
10,866 7/25/04 14:11 A  ? 
10,866 5/28/11 16:24 T  5/28/11 16:24 

レコードをaccs_meth_status_type_cd =」A」とnullでない終了日で(以下の強調表示)。 は期待:accs_meth_status_type_cd =「C」を持つレコードは、実際の を挿入する必要があります。accs_meth_status_type_cd =「C」との録音は私が理解から

10,866 7/29/96 0:01 A  12/27/03 14:16 
10,866 7/25/00 0:01 A  8/20/00 23:59 
10,866 8/20/00 23:59 C  10/2/02 13:00 
10,866 10/2/02 13:00 A  7/25/04 14:11 
10,866 12/15/04 14:16 A  ? 
+0

クローズド・レコードとオープン・レコードは同じようです。違いはありますか?どちらも最新のレコードに対して 'end_dt = NULL'を持っていますか? – zarruq

+0

アクティブレコードの終了日がnullで、ステータスがcのレコードがなく、クローズドレコードのレコードの終了日がNULLでなく、状態cと終了日がNULLのレコードがある – user3901666

答えて

1

を挿入取得されていない、正しく閉じられたレコード(つまりIDは)から構成されています。

  • 行#1:ステータス<> 'C' とEnd_DtはNULLではありません
  • 行#2:ステータス= 'C' とEnd_Dtは
  • End_Dt行#1 = Start_Dt私にNULL IS n行#2

これが正しいと仮定すると、閉鎖する必要のあるレコードを見つけることができます。行#1を持っていますが、行#2)が不足している:

INSERT INTO mytbl (ID, Start_Dt, Status, End_Dt) 
SELECT 
    a.ID, 
    a.End_Dt, -- Use the unclosed row's End_Dt as the Start_Dt for the new "to-be-inserted" row 
    'C', 
    NULL 
FROM mytbl a 
WHERE a.status <> 'C' 
AND a.End_Dt IS NOT NULL -- Get rows that should be considered closed 
AND (a.ID, a.End_Dt) NOT IN (
    -- Check for corresponding records that do not also have a 'C' row 
    -- You can also do this as a LEFT JOIN above 
    SELECT ID, Start_Dt 
    FROM mytbl 
    WHERE Status = 'C' -- Check for presence of 'C' rows 
    AND End_Dt IS NULL -- Check 
) 
QUALIFY ROW_NUMBER() OVER(PARTITION BY a.ID ORDER BY End_Dt DESC) = 1 -- Only return one row per "unclosed" record 
; 

これは、すべてのエッジケースを処理しませんが、それはあなたが始める必要があります。それがあなたが探しているものなら教えてください。
更新

私は私が得た結果、あなたが提供する5つの新しい行に対して上記のクエリを実行し、この:

id  start_dt     status end_dt 
1 10,866 7/25/2000 00:01:00.000000 A  8/20/2000 23:59:00.000000 
2 10,866 8/20/2000 23:59:00.000000 C  10/2/2002 13:00:00.000000 
3 10,866 7/29/1996 00:01:00.000000 A  12/27/2003 14:16:00.000000 
4 10,866 10/2/2002 13:00:00.000000 A  7/25/2004 14:11:00.000000 
5 10,866 12/27/2003 14:16:00.000000 A  ? 
6 10,866 7/25/2004 14:11:00.000000 C  ? 

行を#1-5、元の行です。行番号6は、新たに挿入された「C」行であり、行番号4に対応し、不適切に閉じられた「A」行は不適切である。これはあなたが期待しているのか、それともないのでしょうか?

+0

ありがとうございます。 :) – user3901666

+0

親愛なる@Ravioli、 現在のコードでは、一時的に終了したレコードも閉じられ、別のレコードがCで挿入されています。 上記のコードにサンプルを添付しました。 お知らせください。 – user3901666

+1

対応する 'C'行がない 'A'行のみを閉じる場合は、WHERE句を次のように変更します。 'WHERE a.status = 'A'' クエリで' 'Start_Dt'値を 'A'行の' End_Dt'値に設定します。 "_Dt"の値が一致しない場合は、クローズされていないとみなされ、新しい 'C'行が挿入されます。また、この問合せは、特定のレコードのクローズされていない複数の「A」行のケースを処理しません。最新のものだけが表示されます。行シーケンスの途中に 'C'行を正しく挿入するには、より多くのロジックが必要です。 – ravioli

関連する問題