Sono in una situazione in cui desidero ottenere il valore minimo da 6 colonne.
Finora ho trovato tre modi per raggiungere questo obiettivo, ma ho delle preoccupazioni riguardo alle prestazioni di questi metodi e vorrei sapere quale sarebbe meglio per le prestazioni.
Il primo metodo consiste nell'utilizzare un'istruzione case grande . Ecco un esempio con 3 colonne, basato sull'esempio nel link sopra. La mia dichiarazione sul caso sarebbe molto più lunga poiché guarderò 6 colonne.
Select Id,
Case When Col1 <= Col2 And Col1 <= Col3 Then Col1
When Col2 <= Col3 Then Col2
Else Col3
End As TheMin
From MyTable
La seconda opzione è quella di utilizzare l' UNION
operatore con più istruzioni select . Vorrei inserire questo in un UDF che accetta un parametro Id.
select Id, dbo.GetMinimumFromMyTable(Id)
from MyTable
e
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
E la terza opzione che ho trovato è stata quella di utilizzare l'operatore UNPIVOT , che non sapevo nemmeno esistesse fino ad ora
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
A causa delle dimensioni della tabella e della frequenza con cui questa tabella viene interrogata e aggiornata, sono preoccupato per l'impatto sulle prestazioni che queste query avrebbero sul database.
Questa query verrà effettivamente utilizzata in un join a una tabella con alcuni milioni di record, tuttavia i record restituiti verranno ridotti a circa cento record alla volta. Verrà eseguito più volte durante il giorno e le 6 colonne che sto interrogando vengono aggiornate frequentemente (contengono statistiche giornaliere). Non credo che ci siano indici sulle 6 colonne che sto interrogando.
Quale di questi metodi è migliore per le prestazioni quando si cerca di ottenere il minimo di più colonne? O c'è un altro metodo migliore che non conosco?
Sto usando SQL Server 2005
Dati campione e risultati
Se i miei dati contenessero record come questo:
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
Il risultato finale dovrebbe essere
Valore ID 1 0 2 2 3 1 4 4
Year1
come risultato, il che potrebbe non essere necessariamente corretto.