問題:
2 つの列 (Value と ) を持つテーブルがあるとします。時間。 Value 列が変更された行を特定したいと考えています。つまり、星付きの行で示される、保存された値が変更された瞬間を見つける必要があります。
解決策:
この問題を解決する 1 つのアプローチには、ウィンドウを活用することが含まれます。 SQL ステートメント内の関数と行番号:
行の導入Numbers:
WITH x AS ( SELECT value, time, rn = ROW_NUMBER() OVER (PARTITION BY Value ORDER BY Time) FROM dbo.table )
このステップでは、rn (行番号) と呼ばれる新しい列を導入し、各値パーティション内の各行に時間の昇順で一意のシーケンス番号を割り当てます。
識別変更:
SELECT * FROM x WHERE rn = 1;
このクエリは、rn が 1 に等しい行のみを含むように結果をフィルター処理します。これらは、各値パーティションの最初の行であり、値の変更の開始を表します。
上下に関する追加の考慮事項値:
値列が増加または減少する可能性がある場合は、より複雑なアプローチが必要です:
一時テーブルの作成:
DECLARE @x TABLE(value INT, [time] DATETIME) INSERT @x VALUES (0,'20120615 8:03:43 PM'), (1,'20120615 8:03:43 PM'), (1,'20120615 8:03:48 PM'), (1,'20120615 8:03:53 PM'), (1,'20120615 8:03:58 PM'), (2,'20120615 8:04:03 PM'), (2,'20120615 8:04:08 PM'), (3,'20120615 8:04:13 PM'), (3,'20120615 8:04:18 PM'), (3,'20120615 8:04:23 PM'), (2,'20120615 8:04:28 PM'), (2,'20120615 8:04:33 PM');
サンプル データを使用して一時テーブルを作成して、次のことを説明します。 process.
行番号の導入 (再度):
WITH x AS ( SELECT *, rn = ROW_NUMBER() OVER (ORDER BY time) FROM @x )
値の変更の特定:
SELECT x.value, x.[time] FROM x LEFT OUTER JOIN x AS y ON x.rn = y.rn + 1 AND x.value <> y.value WHERE y.value IS NOT NULL;
このクエリ行番号を持つテーブルとそれ自体のシフトされたバージョン (y) の間で左外部結合を実行し、隣接する行間の値列の変更をチェックします。 y.value に NULL 以外の値が含まれる行は変更を表します。
以上がSQL は時間の経過に伴う列値の変化をどのように識別できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。