1. ホーム
  2. sql

[解決済み] 複数の列から最小値を選択する最良の方法は何ですか?

2023-01-13 21:12:02

質問

SQL Server 2005で次のテーブルがあるとする。

ID   Col1   Col2   Col3
--   ----   ----   ----
1       3     34     76  
2      32    976     24
3       7    235      3
4     245      1    792

次のような結果を得るためのクエリを書く最良の方法は何でしょうか(つまり、最後の列、つまりCol1、Col2、Col3のうち最小の値を含む列を得るためのもの 各行について )?

ID   Col1   Col2   Col3  TheMin
--   ----   ----   ----  ------
1       3     34     76       3
2      32    976     24      24
3       7    235      3       3
4     245      1    792       1

UPDATEです。

明確化のために(コメントで言ったように)実際のシナリオでは、データベースは 適切に正規化されている . これらのquot;array"カラムは実際のテーブルにはありませんが、レポートに必要な結果セットにはあります。そして、新しい要件は、レポートがこの MinValue カラムも必要とすることです。私は基礎となる結果セットを変更することができないので、便利なquot;get out of jail card"を求めてT-SQLに目を向けていました。

私は以下に述べる CASE アプローチを試しましたが、少し面倒ではあるものの、うまくいきました。また、同じ行に2つの最小値があるという事実に対処する必要があるため、回答に記載されているよりも複雑です。

とにかく、私は、私の制約を考えると、かなりうまく機能する、私の現在のソリューションを投稿しようと思いました。それは 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

前もって言っておきますが、これが最高のパフォーマンスを提供するとは思っていません。しかし、状況を考えると (新しい MinValue 列の要件のためだけにすべてのクエリを再設計することはできません)、これはかなりエレガントな "get out of jail card"(刑務所から出るためのカード)です。

どのように解決するのですか?

これを達成するために多くの方法がありそうです。 私の提案は、Case/When を使用してそれを行うことです。 3列であれば、それほど悪いことではありません。

Select Id,
       Case When Col1 < Col2 And Col1 < Col3 Then Col1
            When Col2 < Col1 And Col2 < Col3 Then Col2 
            Else Col3
            End As TheMin
From   YourTableNameHere