ホームページ > データベース > mysql チュートリアル > ROW_NUMBER() を使用して値が変更された行を効率的に識別する方法

ROW_NUMBER() を使用して値が変更された行を効率的に識別する方法

Patricia Arquette
リリース: 2025-01-02 14:25:43
オリジナル
942 人が閲覧しました

How to Efficiently Identify Rows with Value Changes Using ROW_NUMBER()?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート