6列の最小値を取得したい状況です。
これを達成するためにこれまでに3つの方法を見つけましたが、これらの方法のパフォーマンスに懸念があり、どちらがパフォーマンスに優れているかを知りたいと思います。
最初の方法は、大きなcaseステートメントを使用することです。上記のリンクの例に基づいて、3列の例を次に示します。6つの列を見るので、私のcaseステートメントはもっと長くなります。
Select Id,
Case When Col1 <= Col2 And Col1 <= Col3 Then Col1
When Col2 <= Col3 Then Col2
Else Col3
End As TheMin
From MyTable
2番目のオプションはUNION
、複数の選択ステートメントで演算子を使用することです。Idパラメーターを受け入れるUDFにこれを配置します。
select Id, dbo.GetMinimumFromMyTable(Id)
from MyTable
そして
select min(col)
from
(
select col1 [col] from MyTable where Id = @id
union all
select col2 from MyTable where Id = @id
union all
select col3 from MyTable where Id = @id
) as t
そして、私が見つけた第三の選択肢はしたUNPIVOT演算子使用し、私も今まで存在していた知りませんでした、
with cte (ID, Col1, Col2, Col3)
as
(
select ID, Col1, Col2, Col3
from TestTable
)
select cte.ID, Col1, Col2, Col3, TheMin from cte
join
(
select
ID, min(Amount) as TheMin
from
cte
UNPIVOT (Amount for AmountCol in (Col1, Col2, Col3)) as unpvt
group by ID
) as minValues
on cte.ID = minValues.ID
テーブルのサイズと、このテーブルがクエリおよび更新される頻度のために、これらのクエリがデータベースに与えるパフォーマンスへの影響が心配です。
このクエリは、実際には数百万のレコードを持つテーブルへの結合で使用されますが、返されるレコードは一度に約100レコードに削減されます。1日を通して何度も実行され、クエリしている6つの列は頻繁に更新されます(毎日の統計が含まれています)。クエリを実行している6つの列にインデックスがあるとは思わない。
複数の列の最小値を取得しようとするとき、これらの方法のどれがパフォーマンスに優れていますか?または、私が知らない別のより良い方法がありますか?
SQL Server 2005を使用しています
サンプルデータと結果
データに次のようなレコードが含まれている場合:
Id Col1 Col2 Col3 Col4 Col5 Col6 1 3 4 0 2 1 5 2 2 6 10 5 7 9 3 1 1 2 3 4 5 4 9 5 4 6 8 9
最終結果は
ID値 1 0 2 2 3 1 4 4
Year1
結果として返されますが、必ずしも正しいとは限りません。