Estou em uma situação em que quero obter o valor mínimo de 6 colunas.
Até agora, encontrei três maneiras de conseguir isso, mas tenho preocupações com o desempenho desses métodos e gostaria de saber qual seria o melhor para o desempenho.
O primeiro método é usar uma declaração de maiúsculas e minúsculas . Aqui está um exemplo com 3 colunas, com base no exemplo no link acima. Minha declaração de caso seria muito mais longa, já que analisarei 6 colunas.
Select Id,
Case When Col1 <= Col2 And Col1 <= Col3 Then Col1
When Col2 <= Col3 Then Col2
Else Col3
End As TheMin
From MyTable
A segunda opção é usar o UNION
operador com várias instruções de seleção . Eu colocaria isso em um UDF que aceita um parâmetro 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 a terceira opção que encontrei foi usar o operador UNPIVOT , que eu nem sabia que existia até agora
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
Devido ao tamanho da tabela e à frequência com que essa tabela é consultada e atualizada, estou preocupado com o impacto no desempenho dessas consultas no banco de dados.
Essa consulta será realmente usada em uma associação a uma tabela com alguns milhões de registros, no entanto, os registros retornados serão reduzidos para cerca de cem registros por vez. Ele será executado várias vezes ao longo do dia, e as 6 colunas que estou consultando são atualizadas frequentemente (elas contêm estatísticas diárias). Eu não acho que existem índices nas 6 colunas que estou consultando.
Qual desses métodos é melhor para o desempenho ao tentar obter o mínimo de várias colunas? Ou existe outro método melhor que eu não conheço?
Eu estou usando o SQL Server 2005
Dados e resultados de amostra
Se meus dados contiverem 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
O resultado final deve ser
Valor do ID 1 0 2 2 3 1 4 4
Year1
como resultado, o que pode não estar necessariamente correto.