【问题标题】:SQL MAX of multiple columns?多列的SQL MAX?
【发布时间】:2010-09-09 10:03:40
【问题描述】:

如何在多列的最大值中每行返回 1 个值:

表名

[Number, Date1, Date2, Date3, Cost]

我需要返回这样的东西:

[Number, Most_Recent_Date, Cost]

查询?

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    这是一个旧答案,在很多方面都被打破了。

    请参阅https://stackoverflow.com/a/6871572/194653,它有更多的支持并与 sql server 2008+ 一起使用并处理空值等。

    原始但有问题的答案

    好吧,你可以使用 CASE 语句:

    SELECT
        CASE
            WHEN Date1 >= Date2 AND Date1 >= Date3 THEN Date1
            WHEN Date2 >= Date1 AND Date2 >= Date3 THEN Date2
            WHEN Date3 >= Date1 AND Date3 >= Date2 THEN Date3
            ELSE                                        Date1
        END AS MostRecentDate
    

    【讨论】:

    • 使用WHEN Date1 > Date2 AND Date1 > Date3 THEN Date1; WHEN Date2 > Date3 THEN Date3; ELSE Date3不够吗?
    • 显而易见的答案,但它不适用于 NULL 值,并且尝试修复它会变得非常混乱。
    • 删除这个旧帖子,但您可以将每个日期包装成一个 COALESCE 来处理 NULL。其中一个 WHEN 语句将如下所示: WHEN Date1 >= COALESCE(Date2,'') AND Date1 >= COALESCE(Date3,'') THEN Date3 (对其他 when's 执行相同操作)
    • 顺便说一句,当 Date2 为空时,即使 Date3>Date1,它也会返回 Date1。
    • 真的这个答案应该被删除,因为它太糟糕了。不确定它是如何真正获得 178 次投票的,如果您在任何日期中都有 NULL 值,它根本不起作用,这很常见。
    【解决方案2】:

    以下两个示例中的任何一个都可以使用:

    SELECT  MAX(date_columns) AS max_date
    FROM    ( (SELECT   date1 AS date_columns
               FROM     data_table         )
              UNION
              ( SELECT  date2 AS date_columns
                FROM    data_table
              )
              UNION
              ( SELECT  date3 AS date_columns
                FROM    data_table
              )
            ) AS date_query
    

    第二个是lassevk's 答案的附加组件。

    SELECT  MAX(MostRecentDate)
    FROM    ( SELECT    CASE WHEN date1 >= date2
                                  AND date1 >= date3 THEN date1
                             WHEN date2 >= date1
                                  AND date2 >= date3 THEN date2
                             WHEN date3 >= date1
                                  AND date3 >= date2 THEN date3
                             ELSE date1
                        END AS MostRecentDate
              FROM      data_table
            ) AS date_query 
    

    【讨论】:

    • 第一个答案很好,但可以大大简化。第二个答案不适用于 NULL 值。试图解决这个问题会变得非常混乱。
    • 您应该使用 UNION ALL 而不是 UNION 以避免不必要的隐含 DISTINCT 操作。
    【解决方案3】:

    如果您使用的是 MySQL、PostgreSQL 或 Oracle,则可以使用

    SELECT GREATEST(col1, col2 ...) FROM table
    

    【讨论】:

    • 是的,但仍然是一个非常有帮助的答案,因为人们发现这个问题参考了 MySQL。
    • 在 PostgreSQL 中也可以从 8.1 获得。
    • 不能很好地处理 NULL,但是如果你在你的列值周围合并(col1, 0)你会用煤气做饭看到这个答案stackoverflow.com/questions/9831851/…
    • 这个解决方案怎么样:stackoverflow.com/a/2166693/4824854
    • 我刚刚在 TOAD for Oracle SQL 中使用了它,它工作正常。
    【解决方案4】:

    如果您使用的是 SQL Server 2005,则可以使用 UNPIVOT 功能。这是一个完整的例子:

    create table dates 
    (
      number int,
      date1 datetime,
      date2 datetime,
      date3 datetime 
    )
    
    insert into dates values (1, '1/1/2008', '2/4/2008', '3/1/2008')
    insert into dates values (1, '1/2/2008', '2/3/2008', '3/3/2008')
    insert into dates values (1, '1/3/2008', '2/2/2008', '3/2/2008')
    insert into dates values (1, '1/4/2008', '2/1/2008', '3/4/2008')
    
    select max(dateMaxes)
    from (
      select 
        (select max(date1) from dates) date1max, 
        (select max(date2) from dates) date2max,
        (select max(date3) from dates) date3max
    ) myTable
    unpivot (dateMaxes For fieldName In (date1max, date2max, date3max)) as tblPivot
    
    drop table dates
    

    【讨论】:

    • 我觉得我更喜欢 UNION 的例子。
    • "你如何在多列的最大值中返回 ONE VALUE PER ROW"
    【解决方案5】:

    还有 3 种方法,其中 UNPIVOT (1) 是迄今为止最快的,其次是 Simulated Unpivot (3),它比 (1) 慢得多,但仍然比 (2) 快

    CREATE TABLE dates
        (
          number INT PRIMARY KEY ,
          date1 DATETIME ,
          date2 DATETIME ,
          date3 DATETIME ,
          cost INT
        )
    
    INSERT  INTO dates
    VALUES  ( 1, '1/1/2008', '2/4/2008', '3/1/2008', 10 )
    INSERT  INTO dates
    VALUES  ( 2, '1/2/2008', '2/3/2008', '3/3/2008', 20 )
    INSERT  INTO dates
    VALUES  ( 3, '1/3/2008', '2/2/2008', '3/2/2008', 30 )
    INSERT  INTO dates
    VALUES  ( 4, '1/4/2008', '2/1/2008', '3/4/2008', 40 )
    GO
    

    解决方案 1 (UNPIVOT)

    SELECT  number ,
            MAX(dDate) maxDate ,
            cost
    FROM    dates UNPIVOT ( dDate FOR nDate IN ( Date1, Date2,
                                                Date3 ) ) as u
    GROUP BY number ,
            cost 
    GO
    

    解决方案 2(每行子查询)

    SELECT  number ,
            ( SELECT    MAX(dDate) maxDate
              FROM      ( SELECT    d.date1 AS dDate
                          UNION
                          SELECT    d.date2
                          UNION
                          SELECT    d.date3
                        ) a
            ) MaxDate ,
            Cost
    FROM    dates d
    GO
    

    解决方案 3(模拟 UNPIVOT

    ;WITH    maxD
              AS ( SELECT   number ,
                            MAX(CASE rn
                                  WHEN 1 THEN Date1
                                  WHEN 2 THEN date2
                                  ELSE date3
                                END) AS maxDate
                   FROM     dates a
                            CROSS JOIN ( SELECT 1 AS rn
                                         UNION
                                         SELECT 2
                                         UNION
                                         SELECT 3
                                       ) b
                   GROUP BY Number
                 )
        SELECT  dates.number ,
                maxD.maxDate ,
                dates.cost
        FROM    dates
                INNER JOIN MaxD ON dates.number = maxD.number
    GO
    
    DROP TABLE dates
    GO
    

    【讨论】:

    • 不错。我不知道 PIVOT 和 UNPIVOT 运算符。
    • 知道哪些版本的 SQL Server 支持 pivot/unpivot?
    • @CraigYoung SQL Server 2005 COMPATIBILITY_LEVEL 设置为 90。
    • 不错!非常规使用 PIVOT / UNPIVOT。 “迄今为止最快”的任何参考或证据??
    【解决方案6】:
    SELECT 
        CASE 
            WHEN Date1 >= Date2 AND Date1 >= Date3 THEN Date1 
            WHEN Date2 >= Date3 THEN Date2 
            ELSE Date3
        END AS MostRecentDate 
    

    这更容易写出来,并跳过了评估步骤,因为 case 语句是按顺序评估的。

    【讨论】:

    • 小心。如果 Date2 为 NULL,则答案为 Date3;即使 Date1 更大。
    【解决方案7】:
    DECLARE @TableName TABLE (Number INT, Date1 DATETIME, Date2 DATETIME, Date3 DATETIME, Cost MONEY)
    
    INSERT INTO @TableName 
    SELECT 1, '20000101', '20010101','20020101',100 UNION ALL
    SELECT 2, '20000101', '19900101','19980101',99 
    
    SELECT Number,
           Cost  ,
           (SELECT MAX([Date])
           FROM    (SELECT Date1 AS [Date]
                   UNION ALL
                   SELECT Date2
                   UNION ALL
                   SELECT Date3
                   )
                   D
           )
           [Most Recent Date]
    FROM   @TableName
    

    【讨论】:

    • 为我在任何 SQL 版本中工作过,很好的解决方案
    【解决方案8】:

    您可以创建一个传递日期的函数,然后将该函数添加到 select 语句中,如下所示。 select Number, dbo.fxMost_Recent_Date(Date1,Date2,Date3), Cost

    create FUNCTION  fxMost_Recent_Date 
    

    ( @Date1 小日期时间, @Date2 小日期时间, @Date3 小日期时间 ) 返回小日期时间 作为 开始 声明@Result smalldatetime

    declare @MostRecent smalldatetime
    
    set @MostRecent='1/1/1900'
    
    if @Date1>@MostRecent begin set @MostRecent=@Date1 end
    if @Date2>@MostRecent begin set @MostRecent=@Date2 end
    if @Date3>@MostRecent begin set @MostRecent=@Date3 end
    RETURN @MostRecent
    

    结束

    【讨论】:

      【解决方案9】:

      标量函数会导致各种性能问题,因此如果可能,最好将逻辑包装到内联表值函数中。这是我用来替换一些用户定义函数的函数,这些函数从最多十个日期的列表中选择最小/最大日期。在我的 100 万行数据集上进行测试时,标量函数在我终止查询之前花费了 15 分钟以上,内联 TVF 花费了 1 分钟,这与将结果集选择到临时表中的时间相同。要使用此函数,请从 SELECT 或 CROSS APPLY 中的子查询调用函数。

      CREATE FUNCTION dbo.Get_Min_Max_Date
      (
          @Date1  datetime,
          @Date2  datetime,
          @Date3  datetime,
          @Date4  datetime,
          @Date5  datetime,
          @Date6  datetime,
          @Date7  datetime,
          @Date8  datetime,
          @Date9  datetime,
          @Date10 datetime
      )
      RETURNS TABLE
      AS
      RETURN
      (
          SELECT      Max(DateValue)  Max_Date,
                      Min(DateValue)  Min_Date
          FROM        (
                          VALUES  (@Date1),
                                  (@Date2),
                                  (@Date3),
                                  (@Date4),
                                  (@Date5),
                                  (@Date6),
                                  (@Date7),
                                  (@Date8),
                                  (@Date9),
                                  (@Date10)
                      )   AS Dates(DateValue)
      )
      

      【讨论】:

      • 10 年后,我不敢相信你的这个答案只得到 9 分(加上我的)。人们似乎没有意识到效率、清晰度、可读性等。干得好!
      • 它能很好地处理空值吗?
      【解决方案10】:

      基于来自http://www.experts-exchange.com/Microsoft/Development/MS-SQL-Server/Q_24204894.htmlScottPletcher 的解决方案 我创建了一组函数(例如 GetMaxOfDates3 、 GetMaxOfDates13 )来使用 UNION ALL 查找最多 13 个日期值。 见T-SQL function to Get Maximum of values from the same row 但是在编写这些函数时我还没有考虑过 UNPIVOT 解决方案

      CREATE FUNCTION GetMaxOfDates13 (
      @value01 DateTime = NULL,  
      @value02 DateTime = NULL,
      @value03 DateTime = NULL,
      @value04 DateTime = NULL,
      @value05 DateTime = NULL,
      @value06 DateTime = NULL,
      @value07 DateTime = NULL,
      @value08 DateTime = NULL,
      @value09 DateTime = NULL,
      @value10 DateTime = NULL,
      @value11 DateTime = NULL,
      @value12 DateTime = NULL,
      @value13 DateTime = NULL
      )
      RETURNS DateTime
      AS
      BEGIN
      RETURN (
      SELECT TOP 1 value
      FROM (
      SELECT @value01 AS value UNION ALL
      SELECT @value02 UNION ALL
      SELECT @value03 UNION ALL
      SELECT @value04 UNION ALL
      SELECT @value05 UNION ALL
      SELECT @value06 UNION ALL
      SELECT @value07 UNION ALL
      SELECT @value08 UNION ALL
      SELECT @value09 UNION ALL
      SELECT @value10 UNION ALL
      SELECT @value11 UNION ALL
      SELECT @value12 UNION ALL
      SELECT @value13
      ) AS [values]
      ORDER BY value DESC    
      )
      END –FUNCTION
      GO
      CREATE FUNCTION GetMaxOfDates3 (
      @value01 DateTime = NULL,  
      @value02 DateTime = NULL,
      @value03 DateTime = NULL
      )
      RETURNS DateTime
      AS
      BEGIN
      RETURN dbo.GetMaxOfDates13(@value01,@value02,@value03,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL)
      END –FUNCTION
      

      【讨论】:

        【解决方案11】:

        这是使用 T-SQL 和 SQL Server 的 Max 功能的另一个不错的解决方案

        SELECT [Other Fields],
          (SELECT Max(v) 
           FROM (VALUES (date1), (date2), (date3),...) AS value(v)) as [MaxDate]
        FROM [YourTableName]
        

        值是Table Value Constructor

        "指定要构造成表的一组行值表达式。Transact-SQL 表值构造函数允许在单个 DML 语句中指定多行数据。表值构造函数可以指定为 VALUES INSERT ... VALUES 语句的子句,或作为 MERGE 语句的 USING 子句或 FROM 子句中的派生表。"

        【讨论】:

        • SQL 版本必须 >= 2008。
        • 这在 2008 中工作得非常好,并且可以处理 NULL。非常好的解决方案。
        • @Cheburek:从 value(v) 中,“value”是虚拟表的别名,“v”是日期值的虚拟列的名称。
        • 这太棒了。在哪里可以找到此 Value() 虚拟表的文档?
        • 我最初也不了解 VALUE(v)。如果您想了解 VALUE,请尝试创建一个虚拟 1 列表的查询: SELECT * FROM (VALUES (1), (5), (1)) as listOfValues(columnName) 而这个创建虚拟 2 列表的查询: SELECT * FROM (VALUES (1,2), (5,3), (1,4)) as tableOfValues(columnName1, ColumnName2) 现在您可以理解为什么该示例查询中包含 AS value(v)。我的最终查询如下所示: SELECT Max(currentValues) as Max FROM (VALUES (12), (25), (35)) AS allCurrents(currentValues) 它将选择最大值,在这种情况下为 35。
        【解决方案12】:

        不幸的是Lasse's answer,虽然看起来很明显,但有一个关键缺陷。它不能处理 NULL 值。任何单个 NULL 值都会导致返回 Date1。不幸的是,任何解决该问题的尝试都会变得非常混乱,并且不能很好地扩展到 4 个或更多值。

        databyss's first answer 看起来(现在)不错。但是,尚不清楚答案是否可以轻松地推断为来自多表连接的 3 个值,而不是来自单个表的更简单的 3 个值。我想避免将这样的查询变成子查询只是为了获得最多 3 列,我也很确定 databyss 的好主意可以清理一下。

        所以事不宜迟,这是我的解决方案(源自 databyss 的想法)。
        它使用交叉连接选择常量来模拟多表连接的效果。需要注意的重要一点是,所有必要的别名都正确传递(并非总是如此),这使模式非常简单,并且可以通过附加列进行相当大的扩展。

        DECLARE @v1 INT ,
                @v2 INT ,
                @v3 INT
        --SET @v1 = 1 --Comment out SET statements to experiment with 
                      --various combinations of NULL values
        SET @v2 = 2
        SET @v3 = 3
        
        SELECT  ( SELECT    MAX(Vals)
                  FROM      ( SELECT    v1 AS Vals
                              UNION
                              SELECT    v2
                              UNION
                              SELECT    v3
                            ) tmp
                  WHERE     Vals IS NOT NULL -- This eliminates NULL warning
        
                ) AS MaxVal
        FROM    ( SELECT    @v1 AS v1
                ) t1
                CROSS JOIN ( SELECT @v2 AS v2
                           ) t2
                CROSS JOIN ( SELECT @v3 AS v3
                           ) t3
        

        【讨论】:

          【解决方案13】:

          问题:选择给予实体的最小费率值 要求:代理费率可以为空

          [MinRateValue] = 
          CASE 
             WHEN ISNULL(FitchRating.RatingValue, 100) < = ISNULL(MoodyRating.RatingValue, 99) 
             AND  ISNULL(FitchRating.RatingValue, 100) < = ISNULL(StandardPoorsRating.RatingValue, 99) 
             THEN FitchgAgency.RatingAgencyName
          
             WHEN ISNULL(MoodyRating.RatingValue, 100) < = ISNULL(StandardPoorsRating.RatingValue , 99)
             THEN MoodyAgency.RatingAgencyName
          
             ELSE ISNULL(StandardPoorsRating.RatingValue, 'N/A') 
          END 
          

          灵感来自this answer,来自Nat

          【讨论】:

            【解决方案14】:

            请尝试使用UNPIVOT:

            SELECT MAX(MaxDt) MaxDt
               FROM tbl 
            UNPIVOT
               (MaxDt FOR E IN 
                  (Date1, Date2, Date3)
            )AS unpvt;
            

            【讨论】:

              【解决方案15】:

              使用 CROSS APPLY(适用于 2005 年以上)......

              SELECT MostRecentDate 
              FROM SourceTable
                  CROSS APPLY (SELECT MAX(d) MostRecentDate FROM (VALUES (Date1), (Date2), (Date3)) AS a(d)) md
              

              【讨论】:

              • 使用 VALUES 会阻止它在 2005 年起作用。您必须将 VALUES 替换为等效的 SELECT value UNION ALL SELECT value UNION ALL … 系列。
              【解决方案16】:

              从 SQL Server 2012 开始,我们可以使用IIF

               DECLARE @Date1 DATE='2014-07-03';
               DECLARE @Date2 DATE='2014-07-04';
               DECLARE @Date3 DATE='2014-07-05';
              
               SELECT IIF(@Date1>@Date2,
                      IIF(@Date1>@Date3,@Date1,@Date3),
                      IIF(@Date2>@Date3,@Date2,@Date3)) AS MostRecentDate
              

              【讨论】:

              • 相当不错,但不处理空值。例如:DECLARE @Date1 DATE='2014-08-01'; DECLARE @Date2 DATE=null; DECLARE @Date3 DATE='2014-07-05'; /*this gets returned*/
              • 我们可以像这样处理空值:select IIF(@Date1 &gt; @Date2 or @Date2 is null, IIF(@Date1 &gt; @Date3 or @Date3 is null, @Date1, @Date3), IIF(@Date2 &gt; @Date3 or @Date3 is null, @Date2, @Date3)) as MostRecentDate
              【解决方案17】:

              对于 T-SQL (MSSQL 2008+)

              SELECT
                (SELECT
                   MAX(MyMaxName) 
                 FROM ( VALUES 
                          (MAX(Field1)), 
                          (MAX(Field2)) 
                      ) MyAlias(MyMaxName)
                ) 
              FROM MyTable1
              

              【讨论】:

              【解决方案18】:

              这是一个很好的解决方案:

              CREATE function [dbo].[inLineMax] (@v1 float,@v2 float,@v3 float,@v4 float)
              returns float
              as
              begin
              declare @val float
              set @val = 0 
              declare @TableVal table
              (value float )
              insert into @TableVal select @v1
              insert into @TableVal select @v2
              insert into @TableVal select @v3
              insert into @TableVal select @v4
              
              select @val= max(value) from @TableVal
              
              return @val
              end 
              

              【讨论】:

                【解决方案19】:

                我不知道它是否在 SQL 等上……在 M$ACCESS 帮助上有一个名为 MAXA(Value1;Value2;...) 的函数应该这样做。

                希望可以帮助别人。

                P.D.:值可以是列或计算值等。

                【讨论】:

                • Microsoft Access 是一个完全不同的产品。此外,您能否找到您对这种功能的主张?我从未在 Access 中看到或听说过这一点。
                • MAXAExcel function,而不是 Access。
                【解决方案20】:

                CASE WHEN的另一种使用方式

                SELECT CASE true 
                       WHEN max(row1) >= max(row2) THEN CASE true WHEN max(row1) >= max(row3) THEN max(row1) ELSE max(row3) end ELSE
                       CASE true WHEN max(row2) >= max(row3) THEN max(row2) ELSE max(row3) END END
                FROM yourTable
                

                【讨论】:

                  【解决方案21】:

                  我更喜欢基于案例的解决方案,我的假设是,与其他可能的解决方案(如交叉应用、values()、自定义函数等)相比,它对可能的性能下降的影响应该最小。

                  以下是使用大多数可能的测试用例处理空值的 case-when 版本:

                  SELECT
                      CASE 
                          WHEN Date1 > coalesce(Date2,'0001-01-01') AND Date1 > coalesce(Date3,'0001-01-01') THEN Date1 
                          WHEN Date2 > coalesce(Date3,'0001-01-01') THEN Date2 
                          ELSE Date3
                      END AS MostRecentDate
                      , *
                  from 
                  (values
                       (  1, cast('2001-01-01' as Date), cast('2002-01-01' as Date), cast('2003-01-01' as Date))
                      ,(  2, cast('2001-01-01' as Date), cast('2003-01-01' as Date), cast('2002-01-01' as Date))
                      ,(  3, cast('2002-01-01' as Date), cast('2001-01-01' as Date), cast('2003-01-01' as Date))
                      ,(  4, cast('2002-01-01' as Date), cast('2003-01-01' as Date), cast('2001-01-01' as Date))
                      ,(  5, cast('2003-01-01' as Date), cast('2001-01-01' as Date), cast('2002-01-01' as Date))
                      ,(  6, cast('2003-01-01' as Date), cast('2002-01-01' as Date), cast('2001-01-01' as Date))
                      ,( 11, cast(NULL         as Date), cast('2002-01-01' as Date), cast('2003-01-01' as Date))
                      ,( 12, cast(NULL         as Date), cast('2003-01-01' as Date), cast('2002-01-01' as Date))
                      ,( 13, cast('2003-01-01' as Date), cast(NULL         as Date), cast('2002-01-01' as Date))
                      ,( 14, cast('2002-01-01' as Date), cast(NULL         as Date), cast('2003-01-01' as Date))
                      ,( 15, cast('2003-01-01' as Date), cast('2002-01-01' as Date), cast(NULL         as Date))
                      ,( 16, cast('2002-01-01' as Date), cast('2003-01-01' as Date), cast(NULL         as Date))
                      ,( 21, cast('2003-01-01' as Date), cast(NULL         as Date), cast(NULL         as Date))
                      ,( 22, cast(NULL         as Date), cast('2003-01-01' as Date), cast(NULL         as Date))
                      ,( 23, cast(NULL         as Date), cast(NULL         as Date), cast('2003-01-01' as Date))
                      ,( 31, cast(NULL         as Date), cast(NULL         as Date), cast(NULL         as Date))
                  
                  ) as demoValues(id, Date1,Date2,Date3)
                  order by id
                  ;
                  

                  结果是:

                  MostRecent    id   Date1      Date2      Date3
                  2003-01-01    1    2001-01-01 2002-01-01 2003-01-01
                  2003-01-01    2    2001-01-01 2003-01-01 2002-01-01
                  2003-01-01    3    2002-01-01 2001-01-01 2002-01-01
                  2003-01-01    4    2002-01-01 2003-01-01 2001-01-01
                  2003-01-01    5    2003-01-01 2001-01-01 2002-01-01
                  2003-01-01    6    2003-01-01 2002-01-01 2001-01-01
                  2003-01-01    11   NULL       2002-01-01 2003-01-01
                  2003-01-01    12   NULL       2003-01-01 2002-01-01
                  2003-01-01    13   2003-01-01 NULL       2002-01-01
                  2003-01-01    14   2002-01-01 NULL       2003-01-01
                  2003-01-01    15   2003-01-01 2002-01-01 NULL
                  2003-01-01    16   2002-01-01 2003-01-01 NULL
                  2003-01-01    21   2003-01-01 NULL       NULL
                  2003-01-01    22   NULL       2003-01-01 NULL
                  2003-01-01    23   NULL       NULL       2003-01-01
                  NULL          31   NULL       NULL       NULL
                  

                  【讨论】:

                  • 天哪,谢谢先生!我花了这么多时间来做这个仍然给我无效的怪物公式,现在我看到了隧道尽头的光。
                  • 天哪,我需要 15 个日期,救救我
                  【解决方案22】:

                  Above 表为员工工资表,salary1,salary2,salary3,salary4 为列。下面的查询将返回四列中的最大值

                  select  
                   (select Max(salval) from( values (max(salary1)),(max(salary2)),(max(salary3)),(max(Salary4)))alias(salval)) as largest_val
                   from EmployeeSalary
                  

                  运行上面的查询将输出最大_val(10001)

                  上述查询逻辑如下:

                  select Max(salvalue) from(values (10001),(5098),(6070),(7500))alias(salvalue)
                  

                  输出将是 10001

                  【讨论】:

                  • 这几乎是 @sven 于 2011 年 7 月 29 日发布的解决方案的副本
                  【解决方案23】:

                  我的解决方案也可以处理空值比较。它可以通过编写为一个查询来简化,但为了解释,我使用的是 CTE。这个想法是在第 1 步中将比较从 3 个数字减少到 2 个数字,然后在第 2 步中从 2 个数字减少到 1 个数字。

                  with x1 as
                  (
                    select 1 as N1, null as N2, 3 as N3
                    union
                    select 1 as N1, null as N2, null as N3
                    union
                    select null as N1, null as N2, null as N3
                  )
                  ,x2 as
                  (
                  select 
                  N1,N2,N3,
                  IIF(Isnull(N1,0)>=Isnull(N2,0),N1,N2) as max1,
                  IIF(Isnull(N2,0)>=Isnull(N3,0),N2,N3) as max2
                  from x1
                  )
                  ,x3 as
                  (
                   select N1,N2,N3,max1,max2,
                   IIF(IsNull(max1,0)>=IsNull(max2,0),max1,max2) as MaxNo
                   from x2
                  )
                  select * from x3
                  

                  输出:

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2021-02-02
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2020-06-25
                    • 1970-01-01
                    相关资源
                    最近更新 更多