2

日付と時刻を含むテーブルがあります。たとえば、列はDate、、、、ExTimeです。正しい順序で表示する列に基づいて並べ替えています。NewTimeStatusexpkey

extime行ごとの比較を行い、2 番目の行 column を最初の行 columnと比較したいと考えていますNewTime。extime < Newtime の場合status、「1」で更新します。次に、テーブルを行ごとにトラバースします。上記の例の 2 行目が最初になり、新しい 2 行目がプルされて使用されます。これは私が今持っているもののサンプルですが、何らかの理由ですべての行にヒットして機能していません。

UPDATE t
SET t.Status = 1
FROM MyTable t
CROSS APPLY (SELECT TOP 1 NewTime
             FROM MyTable
             WHERE ID = t.ID AND [Date] = t.[Date]
             ORDER BY ExpKey) t1
WHERE t.Extime < t1.NewTime

これは、私が望むようにすべての行にヒットしていません。行が同じ人に関連付けられていることを確認するために、フィールド ID と日付を比較する where 句があります。IDまたは日付が同じでない場合、同じ人に関連付けられていないため、ステータスを更新したくありません. したがって、基本的に行 2 の ID = 行 1 の ID と行 2 の日付 = 行 1 の日付の場合、行 2 の extime を比較して、行 1 の newtime よりも小さいかどうかを確認します。そうであれば、ステータス フィールドを更新します。行 2 の。

この種の機能がすべてではなく、なぜ機能するのかを理解するための助けをいただければ幸いです。

広告。

4

2 に答える 2

0

私はこれをテストしていませんが、隣接する行を比較するという同様の問題に対処しました。ざっとまとめたので、微調整が必​​要かもしれませんが、試してみてください。

;WITH CTE AS
(   SELECT ID,[Date],ExpKey,ExTime,NewTime,
    ROW_NUMBER()OVER(PARTITION BY ID,[Date] ORDER BY ExpKey) AS Sort
    FROM MyTable
)
UPDATE row2
SET row2.[Status] = 2
WHERE row2.ExTime < row1.NewTime
FROM CTE row2
CROSS JOIN CTE row1
    ON row1.ID = row2.ID
    AND row1.[Date] = row2.[Date]
    AND row1.Sort = row2.Sort-1 --Join to prior row
于 2013-10-10T20:55:57.037 に答える