2016-07-25 3 views
-1

最初の行のEffectiveEndDTMをNULLから2番目の行のLoadDTM値に更新しようとしています。最後の行を除くすべての行も同様にNULLになります。データセットから連続する行を更新する

EffectiveStartDTM  EffectiveEndDTM CurrentRecInd LoadID LoadDTM 
2016-06-13 13:05:09.000 NULL   1    130272 2016-06-13 13:05:09.000 
2016-06-27 10:27:13.000 NULL   1    133819 2016-06-27 10:27:13.000 
2016-07-04 10:05:23.000 NULL   1    135323 2016-07-04 10:05:23.000 
2016-07-11 12:11:52.000 NULL   1    136943 2016-07-11 12:11:52.000 

これを行うにはどのような方法が最適ですか?

+0

実際のテーブル? –

+0

SQL Server 2008 R2、申し訳ありません。 – Sharktooth

+0

'ORDER BY'節**を明示的に指定しない限り、' first'、 'second'、' successive'および 'last'はSQL **では意味を持ちません。あなたの注文は何ですか? –

答えて

1
DECLARE @T As Table 
(
    EffectiveStartDTM datetime, 
    EffectiveEndDTM datetime, 
    CurrentRecInd tinyint, 
    LoadID int, 
    LoadDTM datetime 
) 

INSERT INTO @T VALUES 
('2016-06-13 13:05:09.000', NULL, 1, 130272, '2016-06-13 13:05:09.000'), 
('2016-06-27 10:27:13.000', NULL, 1, 133819, '2016-06-27 10:27:13.000'), 
('2016-07-04 10:05:23.000', NULL, 1, 135323, '2016-07-04 10:05:23.000'), 
('2016-07-11 12:11:52.000', NULL, 1, 136943, '2016-07-11 12:11:52.000') 

;WITH cte 
AS 
(
    SELECT 
     *, 
     ROW_NUMBER() OVER (ORDER BY LoadID) AS RowId 
    FROM 
     @T 
) 

SELECT 
    A.LoadID, 
    B.LoadDTM 
FROM 
    cte A LEFT JOIN 
    (
     SELECT cte.RowId -1 AS RowId, cte.LoadDTM FROM cte 
    ) B ON A.RowId = B.RowId 
WHERE 
    A.EffectiveEndDTM IS NULL 

出力

LoadID LoadDTM 
130272 2016-06-27 10:27:13.000 
133819 2016-07-04 10:05:23.000 
135323 2016-07-11 12:11:52.000 
136943 NULL 

アップデートを使用しているDBMS

UPDATE YourTable 
SET EffectiveEndDTM = R.LoadDTM 
FROM 
(
    SELECT 
     A.LoadID, 
     B.LoadDTM 
    FROM 
     cte A LEFT JOIN 
     (
      SELECT cte.RowId -1 AS RowId, cte.LoadDTM FROM cte 
     ) B ON A.RowId = B.RowId 
    WHERE 
     A.EffectiveEndDTM IS NULL 
) R 
WHERE 
    YourTable.LoadID = R.LoadID 
1

2012年に導入されたlead/lag関数を使用することはできませんが、次の/前の行の値を取得できないわけではありません。

作成し、移入したサンプルテーブル(私たちのセーブくださいあなたの将来の質問では、このステップ)

DECLARE @T As Table 
(
    EffectiveStartDTM datetime, 
    EffectiveEndDTM datetime, 
    CurrentRecInd tinyint, 
    LoadID int, 
    LoadDTM datetime 
) 

INSERT INTO @T VALUES 
('2016-06-13 13:05:09.000', NULL, 1, 130272, '2016-06-13 13:05:09.000'), 
('2016-06-27 10:27:13.000', NULL, 1, 133819, '2016-06-27 10:27:13.000'), 
('2016-07-04 10:05:23.000', NULL, 1, 135323, '2016-07-04 10:05:23.000'), 
('2016-07-11 12:11:52.000', NULL, 1, 136943, '2016-07-11 12:11:52.000') 

更新:あなたは、サブクエリが必要

UPDATE T1 
SET EffectiveEndDTM = (
    SELECT TOP 1 EffectiveStartDTM 
    FROM @T T2 
    WHERE T2.EffectiveStartDTM > T1.EffectiveStartDTM 
    ORDER BY T2.EffectiveStartDTM 
) 
FROM @T T1 

テスト更新が成功しました:

SELECT EffectiveStartDTM, EffectiveEndDTM, CurrentRecInd, LoadID, LoadDTM 
FROM @T 

結果:

EffectiveStartDTM  EffectiveEndDTM   CurrentRecInd LoadID  LoadDTM 
----------------------- ----------------------- ------------- ----------- ----------------------- 
2016-06-13 13:05:09.000 2016-06-27 10:27:13.000 1    130272  2016-06-13 13:05:09.000 
2016-06-27 10:27:13.000 2016-07-04 10:05:23.000 1    133819  2016-06-27 10:27:13.000 
2016-07-04 10:05:23.000 2016-07-11 12:11:52.000 1    135323  2016-07-04 10:05:23.000 
2016-07-11 12:11:52.000 NULL     1    136943  2016-07-11 12:11:52.000 
関連する問題