2

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

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

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

那么,如何使用 SQL 获得最低值?

4

6 回答 6

2

可能是这样的

select id
       , least (num1, num2, num3, num4, num5)
from your_table
/

大多数 RDBMS 都提供 LEAST()。

于 2011-08-17T18:21:57.790 回答
2

修复您的数据结构以进行规范化,这样您就不必执行这种复杂的、会破坏性能的工作来获取所需的信息。

于 2011-08-17T20:46:08.130 回答
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
于 2011-08-17T18:46:32.430 回答
0

您可以使用以下公式计算最小值:MIN(a,b) = (a+b)/2 - abs(ab)/2

于 2011-08-17T18:22:18.720 回答
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'd,因为它确实回答了你的问题),是这种方法适用于任意数量的字段,而不仅仅是 5 个。但老实说,TSQL 确实有一些改进的空间——他们确实需要 plsql 的最大/最小功能的 tsql 版本。那好吧...

于 2011-08-17T19:20:52.090 回答
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
于 2011-08-17T20:43:17.380 回答