ホームページ > データベース > mysql チュートリアル > SQL Server で列の値が変更された行を効率的に取得するにはどうすればよいですか?

SQL Server で列の値が変更された行を効率的に取得するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-24 19:58:18
オリジナル
509 人が閲覧しました

How to Efficiently Retrieve Rows Where a Column Value Changes in SQL Server?

進化する列値を含む行の取得

問題:
特定の列値の変更に基づいてテーブルを作成します。提供されたサンプル データでは、「値」列が数回シフトされます。目標は、この値が変更された行のみを特定して選択することです。

解決策:

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

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