ホームページ > データベース > mysql チュートリアル > SQL で行間の値の違いを効率的に計算するにはどうすればよいですか?

SQL で行間の値の違いを効率的に計算するにはどうすればよいですか?

Patricia Arquette
リリース: 2025-01-10 15:26:46
オリジナル
310 人が閲覧しました

How to Efficiently Calculate Row-to-Row Value Differences in SQL?

SQL での連続する行の値の差の計算

データベース クエリには、単純なデータ取得以上のものが含まれることがよくあります。 連続する行の値間の差異を判断することには、共通の課題があります。この記事では、行の順序が厳密に連続していないシナリオに焦点を当てて、SQL でこれらの違いを計算する効率的な方法について詳しく説明します。

シナリオ例:

必ずしも行識別子によって順番に並べられているわけではない、整数値を含むテーブルを想像してください。

<code>rowInt  | Value
--------+------
2       | 23
3       | 45
17      | 10
9       | 0</code>
ログイン後にコピー

目的は、各 Value とその直後の行の Value の差を計算することで、結果は次のようになります。

<code>rowInt   | Value  | Diff
--------+--------+------
2        | 23     | 22
3        | 45     | -35
9        | 0      | -45
17       | 10     | 10</code>
ログイン後にコピー

SQL Server 2005 のアプローチ (プレウィンドウ関数):

ウィンドウ関数が導入される前、SQL Server 2005 は、サブクエリと集計関数を組み合わせた非効率的な方法に依存していました。

<code class="language-sql">SELECT
   [current].rowInt,
   [current].Value,
   ISNULL([next].Value, 0) - [current].Value AS Diff
FROM
   sourceTable AS [current]
LEFT JOIN
   (
      SELECT MIN(rowInt) AS rowInt, Value FROM sourceTable
      WHERE rowInt > [current].rowInt
      GROUP BY Value
   ) AS [next]
      ON [next].rowInt = [current].rowInt</code>
ログイン後にコピー

説明:

  • ISNULL() は後続の行が存在しない場合を処理し、デフォルトは 0 です。
  • サブクエリは、次の行の rowIntValue を見つけます。
  • 差分は、現在の行の Value を次の行の Value から減算することで計算されます。

パフォーマンスに関する考慮事項:

この古い手法では、複数のテーブル スキャンが必要となるため、大規模なデータセットの場合は非効率的になる可能性があります。 最新の SQL は、より最適化されたソリューションを提供します。

以上がSQL で行間の値の違いを効率的に計算するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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