我要从6列中获取最小值。
到目前为止,我已经找到了三种方法来实现此目的,但是我对这些方法的性能感到担忧,并且想知道哪种方法对性能更好。
第一种方法是使用大写语句。这是一个包含3列的示例,基于上面链接中的示例。我的案例陈述将更长,因为我将查看6列。
Select Id,
Case When Col1 <= Col2 And Col1 <= Col3 Then Col1
When Col2 <= Col3 Then Col2
Else Col3
End As TheMin
From MyTable
第二种选择是将UNION
运算符与多个select语句一起使用。我将其放在接受Id参数的UDF中。
select Id, dbo.GetMinimumFromMyTable(Id)
from MyTable
和
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
我发现的第三个选择是使用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
由于表的大小以及查询和更新该表的频率,我担心这些查询对数据库的性能影响。
该查询实际上将用于连接具有几百万条记录的表,但是返回的记录一次将减少到约一百条。它将在一天内运行很多次,并且我查询的6列会经常更新(它们包含每日统计信息)。我认为我要查询的6列上没有任何索引。
尝试获取最少的多列时,以下哪种方法对性能更好?还是有我不知道的另一种更好的方法?
我正在使用SQL Server 2005
样本数据和结果
如果我的数据包含这样的记录:
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
最终结果应该是
编号值 1 0 2 2 3 1 4 4
Year1
作为结果返回,这不一定是正确的。