使用 SQL 2005,有没有办法在单行数据中选择 5 列之间的最小值?
所以,如果我有一排这样的数据:
id num1 num2 num3 num4 num5
1 22 51 4 99 34
那么,如何使用 SQL 获得最低值?
使用 SQL 2005,有没有办法在单行数据中选择 5 列之间的最小值?
所以,如果我有一排这样的数据:
id num1 num2 num3 num4 num5
1 22 51 4 99 34
那么,如何使用 SQL 获得最低值?
可能是这样的
select id
, least (num1, num2, num3, num4, num5)
from your_table
/
大多数 RDBMS 都提供 LEAST()。
修复您的数据结构以进行规范化,这样您就不必执行这种复杂的、会破坏性能的工作来获取所需的信息。
您可以创建 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
您可以使用以下公式计算最小值:MIN(a,b) = (a+b)/2 - abs(ab)/2
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'd,因为它确实回答了你的问题),是这种方法适用于任意数量的字段,而不仅仅是 5 个。但老实说,TSQL 确实有一些改进的空间——他们确实需要 plsql 的最大/最小功能的 tsql 版本。那好吧...
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