[解決済み] 複数の列から最小値を選択する最良の方法は何ですか?
質問
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
関連
-
ERROR 1136 (21S01) を解決してください。列の数が Mysql の行 1 の値の数と一致しません。
-
解決策:java.sql.SQLException: ユーザー ''@'localhost'' (パスワード: YES を使用) のアクセスが拒否されました。
-
SQL-初心者のためのベスト入門SQLクエリ I
-
[解決済み] ストアドプロシージャ 'dbo.aspnet_CheckSchemaVersion' が見つかりませんでした。
-
[解決済み] SQL Serverでストアドプロシージャ内のテキストを検索する
-
[解決済み] SQL Serverで結果をページ分割する最も良い方法は何ですか?
-
[解決済み] 項目xにアクセスできるように文字列を分割するにはどうすればよいですか?
-
[解決済み] "ON UPDATE CASCADE "を使用する場合について
-
[解決済み] ランダムな行を選択する最適な方法 PostgreSQL
-
[解決済み】辞書内の最小値に対応するキーを取得する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
org.postgresql.util.PSQLException: ERROR: リレーション "userinfo" の列 "loginid" が存在しません。
-
[解決済み] LINQでInclude()は何をするのですか?
-
[解決済み] MongoDBに "like "を使ってクエリを実行する方法
-
[解決済み] SQLのSELECTでIF...THENを実行するにはどうすればよいですか?
-
[解決済み] ...値に挿入する ( SELECT ... FROM ... )
-
[解決済み] SQL Serverでレコードを削除した後、IDシードをリセットする。
-
[解決済み] SQL SELECT WHERE フィールドに単語が含まれる場合
-
[解決済み] ある列の最大値を持つ行を取得する
-
[解決済み] SQL Serverには、.NETのMath.Maxのような2つの値を取るMax関数はありますか?
-
[解決済み] SQLサーバーで行を列に効率的に変換する