【问题标题】:SQL Selecting MIN value from row data, not column dataSQL从行数据中选择MIN值,而不是列数据
【发布时间】:2011-10-29 04:15:50
【问题描述】:

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

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

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

那么,如何使用 SQL 获取最小值?

【问题讨论】:

  • 仅供参考,如果您的数据代表相同的信息,它们应该在 ROWS 而不是 FIELDS 中。
  • 你用的是什么sql?
  • 请指定/标记您使用的 SQL Server 版本。解决方案可能会有所不同,因为较新版本的 SQL Server 具有更复杂的可用语法(例如窗口函数)。并不是说这些会在这里使用,只是试图鼓励始终指定的做法。

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


【解决方案1】:

大概是这样的

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

大多数 RDBMS 都提供 LEAST()。

【讨论】:

  • MSSQL 无法做到这一点,这是我正在使用的。
【解决方案2】:

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

【讨论】:

  • 如果可能的话,应该多次投票。这确实是最好的建议。
【解决方案3】:

您可以创建 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

【讨论】:

  • @djangofan - 它可以与 varchar() 一起使用,但所有字段都必须是相同的数据类型。要么由他们自己,要么你需要他们。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    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 版本。哦,好吧……

    【讨论】:

      【解决方案6】:
      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-28
        • 1970-01-01
        • 2021-07-23
        • 2016-02-08
        • 2012-02-12
        • 1970-01-01
        相关资源
        最近更新 更多