データクリーンアップスクリプトの最終段階で苦労している年齢の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つの段階で行われています。
上記のデータセットで概説されているロジックに従って日付を更新します。
各レコードの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);
サンプルの設定では、日付は 'varchar(23)'として定義されています。実際のデータベースでもその日付がどのように定義されていますか?(あなたはそれらを "日時"と呼んでおり、日付関数を使用しているので混乱しています) – HoneyBadger
申し訳ありませんが、私はこれをSQLFIddleを使って作成し、型を変更しました。私は今編集するでしょう...彼らはDATETIMEでなければなりません。 – MoonKnight
あなたはどのバージョンのSQL Serverを使用していますか? – JamieD77