2016-07-21 13 views
0

データクリーンアップスクリプトの最終段階で苦労している年齢のSQLを書いていません。既存のスクリプトの出力例は、SQL Serverで重複するDateTimeの修正

MRN ID  ADTM     SDTM     WardDays WardMins 
45 45_1 2016-03-24 06:28:00.000 2016-03-24 18:15:00.000 0   707 
45 45_2 2016-03-24 11:07:00.000 2016-03-24 18:15:00.000 0   428 

MRN ID  ADTM     SDTM     TDays Tminutes 
381 381_1 2016-01-30 00:25:00.000 2016-01-31 16:53:00.000 0  1415 
381 381_1 2016-01-31 00:00:00.000 2016-01-31 16:53:00.000 0  1013 
381 381_2 2016-01-31 11:30:00.000 2016-01-31 16:53:00.000 0  323 
381 381_3 2016-01-31 16:53:00.000 2016-02-01 17:50:00.000 0  427 
381 381_3 2016-02-01 00:00:00.000 2016-02-01 17:50:00.000 0  1070 

です。同じ[non-unique] [ID]フィールドの重複する日付が問題です。最初のケースでは、私が(イタリックで修正して)欲しい出力は次のようになります。

MRN ID  ADTM     SDTM      WardDays WardMins 
45 45_1 2016-03-24 06:28:00.000 _2016-03-24 11:07:00.000_ 0   335 
45 45_2 2016-03-24 11:07:00.000 2016-03-24 18:15:00.000  0   428 

とレコードの第二セットのために:

MRN ID ADTM     SDTM      TDays Tminutes 
381 381_1 2016-01-30 00:25:00.000 _2016-01-31 00:00:00.000_ 0  1415 
381 381_1 2016-01-31 00:00:00.000 _2016-01-31 11:30:00.000_ 0  690 
381 381_2 2016-01-31 11:30:00.000 2016-01-31 16:53:00.000  0  323 
381 381_3 2016-01-31 16:53:00.000 _2016-02-01 00:00:00.000_ 0  427 
381 381_3 2016-02-01 00:00:00.000 2016-02-01 17:50:00.000  0  1070 

だから、私は望んでいないことを確認します次のレコード開始日時[ADTM]と重複する任意の2つのレコードの終了日時[SDTM]。これは2つの段階で行われています。

  1. 上記のデータセットで概説されているロジックに従って日付を更新します。

  2. 各レコードのTDaysとTMinutesを更新します。パート1のために、私はCTEクエリをいじるされている

    CREATE TABLE T (
        MRN int, ID varchar(5), ADTM varchar(23), SDTM varchar(23), TDays int, TMinutes int); 
    
    INSERT INTO T 
        (MRN, ID, ADTM, SDTM, TDays, TMinutes) 
    VALUES 
        (45, '45_1', '2016-03-24 06:28:00.000', '2016-03-24 18:15:00.000', 0, 707), 
        (45, '45_2', '2016-03-24 11:07:00.000', '2016-03-24 18:15:00.000', 0, 428), 
        (381, '381_1', '2016-01-30 00:25:00.000', '2016-01-31 16:53:00.000', 0, 1415), 
        (381, '381_1', '2016-01-31 00:00:00.000', '2016-01-31 16:53:00.000', 0, 1013), 
        (381, '381_3', '2016-01-31 16:53:00.000', '2016-02-01 17:50:00.000', 0, 427), 
        (381, '381_3', '2016-02-01 00:00:00.000', '2016-02-01 17:50:00.000', 0, 1070), 
        (381, '381_2', '2016-01-31 11:30:00.000', '2016-01-31 16:53:00.000', 0, 323); 
    

    が、これは単に重複レコードをマージされます。設定するには

データセット、使用してください。私は必要な条件をチェックするために前のレコードを照会する必要があり、私は大きな時間を失っています。

; WITH StartD AS 
(
    SELECT ID, ADTM, ROW_NUMBER() 
    OVER(PARTITION BY ID ORDER BY ADTM) AS Rn 
    FROM 
     WD AS t 
    WHERE 
     NOT EXISTS 
     (
      SELECT * 
      FROM WD AS p 
      WHERE p.ID = t.ID 
       AND p.ADTM < t.ADTM 
       AND t.ADTM <= DATEADD(day, 1, p.SDTM) 
     ) 
) , EndD AS 
(
    SELECT ID, SDTM, ROW_NUMBER() 
    OVER(PARTITION BY ID ORDER BY SDTM) AS Rn 
    FROM 
     WD AS t 
    WHERE 
     NOT EXISTS 
     ( 
      SELECT * 
      FROM WD AS p 
      WHERE p.ID = t.ID 
       AND DATEADD(day, -1, p.ADTM) <= t.SDTM 
       AND t.SDTM < p.SDTM 
     ) 
) SELECT s.ID, s.ADTM, e.SDTM 
    FROM StartD AS s JOIN EndD AS e 
     ON e.ID = s.ID AND e.Rn = s.Rn; 

これがどのように実行されるかに関するアドバイスはありますか?

お時間をいただきありがとうございます。

MRN ID  ADTM     SDTM     TDays Tminutes 
381 381_1 2016-01-30 00:25:00.000 2016-01-31 00:00:00.000 0  1415 
381 381_2 2016-01-31 11:30:00.000 2016-02-01 00:00:00.000 0  323 
381 381_3 2016-01-31 16:53:00.000 2016-02-01 00:00:00.000 0  1070 

新しい表は次のとおりです:


この場合は、受け入れ答えで固定取得されていない

CREATE TABLE T (
    MRN int, ID varchar(5), ADTM varchar(23), SDTM varchar(23), TDays int, TMinutes int); 

INSERT INTO T 
    (MRN, ID, ADTM, SDTM, TDays, TMinutes) 
VALUES 
    (45, '45_1', '2016-03-24 06:28:00.000', '2016-03-24 18:15:00.000', 0, 707), 
    (45, '45_2', '2016-03-24 11:07:00.000', '2016-03-24 18:15:00.000', 0, 428), 
    (381, '381_1', '2016-01-30 00:25:00.000', '2016-01-31 00:00:00.000', 0, 1415), 
    (381, '381_2', '2016-01-31 11:30:00.000', '2016-02-01 00:00:00.000', 0, 323), 
    (381, '381_3', '2016-01-31 16:53:00.000', '2016-02-01 00:00:00.000', 0, 427); 
+0

サンプルの設定では、日付は 'varchar(23)'として定義されています。実際のデータベースでもその日付がどのように定義されていますか?(あなたはそれらを "日時"と呼んでおり、日付関数を使用しているので混乱しています) – HoneyBadger

+0

申し訳ありませんが、私はこれをSQLFIddleを使って作成し、型を変更しました。私は今編集するでしょう...彼らはDATETIMEでなければなりません。 – MoonKnight

+0

あなたはどのバージョンのSQL Serverを使用していますか? – JamieD77

答えて

1

これは、SQLで何をしたいあなたを取得する必要があります2008

SELECT t1.ID, 
     t1.ADTM, 
     COALESCE(t2.ADTM,t1.SDTM) SDTM, 
     DATEDIFF(MINUTE,t1.ADTM,COALESCE(t2.ADTM,t1.SDTM)) Tminutes 
FROM T t1 
     OUTER APPLY (SELECT TOP 1 
          * 
        FROM T t2 
        WHERE t2.MRN = t1.MRN 
          AND t2.ADTM > t1.ADTM 
          AND t2.ADTM <> t1.SDTM 
        ORDER BY adtm 
        ) t2 
ORDER BY t1.ID 
+0

私は長期間離れていたときに、時々私はSQLを自由に書くことができません。非常にありがとうございます... – MoonKnight

1

これは右のようです起動するトンの道:

declare @T table (MRN int, ID varchar(5), ADTM varchar(23), SDTM varchar(23), 
        TDays int, TMinutes int); 

INSERT INTO @T (MRN, ID, ADTM, SDTM, TDays, TMinutes) VALUES 
(45, '45_1', '2016-03-24 06:28:00.000', '2016-03-24 18:15:00.000', 0, 707), 
(45, '45_2', '2016-03-24 11:07:00.000', '2016-03-24 18:15:00.000', 0, 428), 
(381, '381_1', '2016-01-30 00:25:00.000', '2016-01-31 16:53:00.000', 0, 1415), 
(381, '381_1', '2016-01-31 00:00:00.000', '2016-01-31 16:53:00.000', 0, 1013), 
(381, '381_3', '2016-01-31 16:53:00.000', '2016-02-01 17:50:00.000', 0, 427), 
(381, '381_3', '2016-02-01 00:00:00.000', '2016-02-01 17:50:00.000', 0, 1070), 
(381, '381_2', '2016-01-31 11:30:00.000', '2016-01-31 16:53:00.000', 0, 323); 

;With Ordered as (
    select 
     *, 
     ROW_NUMBER() OVER (PARTITION BY MRN order by ADTM) as rn 
    from 
     @T 
), Ends as (
    select 
     o1.MRN, 
     o1.ID, 
     o1.ADTM, 
     CASE WHEN o2.ADTM < o1.SDTM THEN o2.ADTM ELSE o1.SDTM END as SDTM 
    from 
     Ordered o1 
      left join 
     Ordered o2 
      on 
       o1.MRN = o2.MRN and 
       o1.rn= o2.rn - 1 
) 
select 
    *, 
    DATEDIFF(minute,ADTM,SDTM) as TMinutes 
from Ends 

結果:

MRN   ID ADTM     SDTM     TMinutes 
----------- ----- ----------------------- ----------------------- ----------- 
45   45_1 2016-03-24 06:28:00.000 2016-03-24 11:07:00.000 279 
45   45_2 2016-03-24 11:07:00.000 2016-03-24 18:15:00.000 428 
381   381_1 2016-01-30 00:25:00.000 2016-01-31 00:00:00.000 1415 
381   381_1 2016-01-31 00:00:00.000 2016-01-31 11:30:00.000 690 
381   381_2 2016-01-31 11:30:00.000 2016-01-31 16:53:00.000 323 
381   381_3 2016-01-31 16:53:00.000 2016-02-01 00:00:00.000 427 
381   381_3 2016-02-01 00:00:00.000 2016-02-01 17:50:00.000 1070 

あなたのサンプルデータが不完全であるか、私は何かが欠けていない限り、私たちは常に(だけでそれらをソートした後の次の行で、各行が一致ADTM)、現在のSDTMまたは次の行ADTMのいずれか早い方を入力します(CASE経由)。

+0

ええ、それは素晴らしいですが、私は長期間離れていたときにSQLを自由に書くことができません。あなたの時間のために大変感謝しています... – MoonKnight

関連する問題