SQL を使用して列値が変更された行をクエリする
テーブル内で列値が変更されたインスタンスを特定するにはどうすればよいでしょうか?このクエリを使用すると、特定の列の値が変更された行を識別できます。
例として、次の表を考えてみます。
Value Time 0 15/06/2012 8:03:43 PM 1 15/06/2012 8:03:43 PM * 1 15/06/2012 8:03:48 PM 1 15/06/2012 8:03:53 PM 1 15/06/2012 8:03:58 PM 2 15/06/2012 8:04:03 PM * 2 15/06/2012 8:04:08 PM 3 15/06/2012 8:04:13 PM * 3 15/06/2012 8:04:18 PM 3 15/06/2012 8:04:23 PM 2 15/06/2012 8:04:28 PM * 2 15/06/2012 8:04:33 PM
目的は、アスタリスクの付いた行を選択することです。値が変化することを示します。これは、これらの変更に関連する時間間隔を決定するために重要であり、他のデータベース クエリに利用できます。
解決策:
ウィンドウ関数と SQL クエリを実装します。行番号から、必要な行番号を導き出します。行:
;WITH x AS ( SELECT value, time, rn = ROW_NUMBER() OVER (PARTITION BY Value ORDER BY Time) FROM dbo.table ) SELECT * FROM x WHERE rn = 1;
説明:
追加の考慮事項:
SELECT * FROM table WHERE value <> LAG(value) OVER (ORDER BY time);
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'); ;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;
SQL のウィンドウ関数の機能を活用することで、このクエリは列の値が変更された行を効果的に取得し、データの変動に関する貴重な洞察を提供します。
以上が列の値が変更された SQL 行を特定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。