SQL从行数据中选择MIN值,而不是列数据

时间:2011-08-17 18:17:46

标签: sql sql-server sql-server-2005 compare min

使用SQL 2005,有没有办法在一行数据中选择5列之间的最小值?

所以,如果我有一行这样的数据:

id    num1    num2    num3   num4    num5
1     22      51      4      99      34

然后,如何使用SQL获得最低值?

6 个答案:

答案 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