ROW_NUMBER を使用した値の変更のある行の選択
値の列が時間の経過とともに変化する状態を反映するテーブルのコンテキストでは、その値が変化した瞬間は、貴重な分析作業となる可能性があります。この記事では、値が増加または変動する両方のシナリオを考慮して、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;
ROW_NUMBER 関数は、テーブルを値列で分割し、各パーティション内の時間値の順に行に連続した番号を割り当てます。 ROW_NUMBER が 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;
この場合、ROW_NUMBERS を時系列でデータセット全体に割り当てます。次に、テーブル自体との LEFT OUTER JOIN を実行し、連続する ROW_NUMBERS と等しくない値を持つ行を照合します。その結果、次の行に個別の値を持つ行のみが確実に選択されます。
以上がROW_NUMBER() を使用して値が変更された行を効率的に識別する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。