Wie kann der Mindestwert aus mehreren Spalten am besten ausgewählt werden?
Geben Sie die folgende Tabelle in SQL Server 2005 an:
ID Col1 Col2 Col3
-- ---- ---- ----
1 3 34 76
2 32 976 24
3 7 235 3
4 245 1 792
Was ist der beste Weg, um die Abfrage zu schreiben, die das folgende Ergebnis liefert (d. H. Eine, die die letzte Spalte liefert - eine Spalte mit den Mindestwerten aus Col1, Col2 und Col 3Für jede Reih)?
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
AKTUALISIEREN
Zur Verdeutlichung (wie ich in den Kommentaren gesagt habe) ist die Datenbank im realen Szenario ordnungsgemäß normalisiert. Diese "Array" -Spalten befinden sich nicht in einer tatsächlichen Tabelle, sondern in einer Ergebnismenge, die in einem Bericht erforderlich ist. Neu ist, dass der Bericht auch diese MinValue-Spalte benötigt. Ich kann die zugrunde liegende Ergebnismenge nicht ändern und habe daher bei T-SQL nach einem praktischen "Get out of Jail Card" gesucht.
Ich habe den unten genannten CASE-Ansatz ausprobiert und er funktioniert, obwohl er etwas umständlich ist. Es ist auch komplizierter als in den Antworten angegeben, da Sie die Tatsache berücksichtigen müssen, dass sich zwei min-Werte in derselben Zeile befinden.
Anyway, ich dachte, ich würde meine aktuelle Lösung posten, die aufgrund meiner Einschränkungen ziemlich gut funktioniert. Es wird der UNPIVOT-Operator verwendet:
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
Ich sage vorweg, dass ich nicht erwarte, dass dies die beste Leistung bietet, aber unter den gegebenen Umständen (ich kann nicht alle Abfragen nur für die neue MinValue-Spaltenanforderung umgestalten), ist es ein ziemlich elegantes "Raus aus" Gefängniskarte ".