2

単一のmoney列を持つテーブルがある場合、?を使用してそのテーブル内の任意の2つの値の最小の差を計算するにはどうすればよいTSQLですか?何百万もの行で機能する、パフォーマンスが最適化されたソリューションを探しています。

4

1 に答える 1

2

SQL Server 2012の場合、次を使用できます

;WITH CTE
     AS (SELECT YourColumn - Lag(YourColumn) OVER (ORDER BY YourColumn) AS Diff
         FROM   YourTable)
SELECT 
      Min(Diff) AS MinDiff
FROM   CTE 

これは、テーブルの1回のスキャンで実行されます(理想的にはYourColumn、並べ替えを回避するためにインデックスをオンにし、その単一の列のインデックスを狭くするとIOが減少します)。

私はそれを短絡させる良い方法を考えることができないので、それがゼロの可能な最小の差を見つけた場合、テーブルのスキャンを1回未満行います。リストに追加MIN(CASE WHEN Diff = 0 THEN 1/0 END)し、SELECTゼロが見つかったというシグナルとしてゼロ除算エラーをトラップすることはおそらく機能しますが、そのアプローチを実際に推奨することはできません...

于 2012-09-14T20:13:52.813 に答える