進化する列値を含む行の取得
問題:
特定の列値の変更に基づいてテーブルを作成します。提供されたサンプル データでは、「値」列が数回シフトされます。目標は、この値が変更された行のみを特定して選択することです。
解決策:
ROW_NUMBER パーティショニングの使用:
この手法では、SQL Server の ROW_NUMBER 関数を利用して、個別の行に連続番号を割り当てます。 「値」パーティション。「時間」順にソートされます。次のクエリは、この概念を適用します。
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;
「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'); ;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;
このクエリは、一連の JOIN とフィルターを使用して値の変更を識別し、その結果、「値」が変更された回数のリストが得られます。変更されました。
以上がSQL Server で列の値が変更された行を効率的に取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。