Estoy en una situación en la que quiero obtener el valor mínimo de 6 columnas.
Hasta ahora he encontrado tres formas de lograr esto, pero me preocupa el rendimiento de estos métodos y me gustaría saber cuál sería mejor para el rendimiento.
El primer método es usar una declaración de caso grande . Aquí hay un ejemplo con 3 columnas, basado en el ejemplo en el enlace de arriba. Mi declaración de caso sería mucho más larga ya que miraré 6 columnas.
Select Id,
Case When Col1 <= Col2 And Col1 <= Col3 Then Col1
When Col2 <= Col3 Then Col2
Else Col3
End As TheMin
From MyTable
La segunda opción es usar el UNION
operador con múltiples sentencias select . Pondría esto en un UDF que acepte un parámetro Id.
select Id, dbo.GetMinimumFromMyTable(Id)
from MyTable
y
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
Y la tercera opción que encontré fue usar el operador UNPIVOT , que ni siquiera sabía que existía hasta ahora
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
Debido al tamaño de la tabla y la frecuencia con la que se consulta y actualiza esta tabla, me preocupa el impacto en el rendimiento que estas consultas tendrían en la base de datos.
Esta consulta se usará realmente en una unión a una tabla con unos pocos millones de registros, sin embargo, los registros devueltos se reducirán a alrededor de cien registros a la vez. Se ejecutará muchas veces durante el día, y las 6 columnas que estoy consultando se actualizan con frecuencia (contienen estadísticas diarias). No creo que haya ningún índice en las 6 columnas que estoy consultando.
¿Cuál de estos métodos es mejor para el rendimiento cuando se intenta obtener el mínimo de varias columnas? ¿O hay otro método mejor que no conozco?
Estoy usando SQL Server 2005
Datos de muestra y resultados
Si mis datos contienen registros como este:
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
El resultado final debe ser
Id Value 1 0 2 2 3 1 4 4
Year1
como resultado, lo que puede no ser necesariamente correcto.