鉴于在SQL Server 2005下表:从几列中选择最小值的最佳方法是什么?
ID Col1 Col2 Col3
-- ---- ---- ----
1 3 34 76
2 32 976 24
3 7 235 3
4 245 1 792
什么是写得出以下结果(即一个能产生最后一列的查询的最佳方式 - 包含铅丹值的列了Col1中的,Col2和Col 3 ,每行)?
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
UPDATE:
为了澄清(正如我在评析说)在真实场景中的数据库是正确归。这些“数组”列不在实际表格中,但在报告中需要的结果集中。新的要求是报告也需要这个MinValue列。我无法更改底层结果集,因此我正在寻找T-SQL来获得方便的“走出监狱卡”。
我尝试了下面提到的CASE方法,它的工作原理虽然有点麻烦。它比答案中陈述的要复杂得多,因为你需要迎合在同一行中有两个最小值的事实。
无论如何,我想我会发布我目前的解决方案,鉴于我的限制,它运行得非常好。它使用了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
我会说的前期,我不希望这提供最佳的性能,但鉴于这种情况(我不能重新设计只是为新的MINVALUE列的所有查询要求),这是一个非常优雅的“走出监狱卡”。
恕我直言,作者的UNPIVOT解决方案优于其他答案。 – 2011-11-11 11:31:45
我发现Nizam的解决方案是最精简的解决方案,即使我花了一段时间才开始了解它。精益和非常有用。 – 2015-08-27 15:09:18