使用SQL 2005,有没有办法在一行数据中选择5列之间的最小值?
所以,如果我有一行这样的数据:
id num1 num2 num3 num4 num5
1 22 51 4 99 34
然后,如何使用SQL获得最低值?
答案 0 :(得分:2)
可能类似
select id
, least (num1, num2, num3, num4, num5)
from your_table
/
大多数RDBMS提供LEAST()。
答案 1 :(得分:2)
修复您的数据结构以进行规范化,这样您就不必执行此复杂的性能查杀操作来获取所需的信息。
答案 2 :(得分:1)
您可以创建UDF。
create function GetMin(@N1 int, @N2 int, @N3 int, @N4 int, @N5 int)
returns table as
return (select min(N) as Value
from (select @N1
union all
select @N2
union all
select @N3
union all
select @N4
union all
select @N5) as T(N))
并像这样使用它。
declare @T table
(
id int,
num1 int,
num2 int,
num3 int,
num4 int,
num5 int
)
insert into @T values
(1, 22, 51, 4, 99, 34),
(2, 222, 251, 24, 299, 234)
select id,
M.Value
from @T
cross apply dbo.GetMin(num1, num2, num3, num4, num5) as M
或者您可以跳过UDF并直接使用查询。
select id,
M.Value
from @T
cross apply (select min(N) as Value
from (select num1
union all
select num2
union all
select num3
union all
select num4
union all
select num5) as T(N)) as M
答案 3 :(得分:0)
您可以使用以下公式计算min:MIN(a,b)=(a + b)/ 2 - abs(a-b)/ 2
答案 4 :(得分:0)
TSQL可以做到这一点,但需要一点准备......
首先,你需要一个功能:
(它采用逗号分隔的整数字符串,并返回最大整数)
CREATE Function [dbo].[GreatestInt]
( @Array varchar(max) )
Returns int As
BEGIN
DECLARE @end Int
DECLARE @start Int
DECLARE @tbl_int Table (myInt Int)
DECLARE @return Int
SET @Array = @Array + ','
SET @start=1
SET @end=1
WHILE @end<Len(@Array)
BEGIN
SET @end = CharIndex(',', @Array, @end)
INSERT INTO @tbl_int
SELECT
Cast(Substring(@Array, @start, @end-@start) As Int)
SET @start=@end+1
SET @end = @end+1
END
SET @return = (SELECT MAX(myInt) FROM @tbl_int)
RETURN @return
END
然后创建你的整数字符串(这是TSQL不太擅长的部分):
(在SELECT中)
stuff(
stuff([num5], 1, 0,',')
,1,0,
stuff(
stuff([num4], 1, 0,',')
,1,0,
stuff(
stuff([num3], 1, 0,',')
,1,0,
stuff(
stuff([num2], 1, 0,',')
,1,0,
[num1]
)
)
)
)
所以要使用这个功能:
SELECT
id,
dbo.GreatestInt( stuff(
stuff([num5], 1, 0,',')
,1,0,
stuff(
stuff([num4], 1, 0,',')
,1,0,
stuff(
stuff([num3], 1, 0,',')
,1,0,
stuff(
stuff([num2], 1, 0,',')
,1,0,
[num1]
)
)
)
)
)
FROM
myTable
我之所以这样做的原因,而不是@mikael在他的回答中做出的方式(因为它确实回答了你的问题我得到了+1)因为这种方法适用于任何数量的领域,而不是但是老实说,TSQL确实有一些改进空间 - 他们真的需要一个tsql版本的plsql最大/最少的功能。哦,好吧......
答案 5 :(得分:0)
SELECT id
, CASE WHEN num1 < num2 AND num1 < num3 AND num1 < num4 AND num1 < num5
THEN num1
WHEN num2 < num3 AND num2 < num4 AND num2 < num5
THEN num2
WHEN num3 < num4 AND num3 < num5
THEN num3
WHEN num4 < num5
THEN num4
ELSE num5
END AS LeastNum
FROM MyTable