SQL MAX of multiple columns?

后端 未结 22 1806
伪装坚强ぢ
伪装坚强ぢ 2020-11-22 02:03

How do you return 1 value per row of the max of several columns:

TableName

[Number, Date1, Date2, Date3, Cost]

I n

相关标签:
22条回答
  • 2020-11-22 02:29

    You could create a function where you pass the dates and then add the function to the select statement like below. select Number, dbo.fxMost_Recent_Date(Date1,Date2,Date3), Cost

    create FUNCTION  fxMost_Recent_Date 
    

    ( @Date1 smalldatetime, @Date2 smalldatetime, @Date3 smalldatetime ) RETURNS smalldatetime AS BEGIN DECLARE @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
    

    END

    0 讨论(0)
  • 2020-11-22 02:31

    I prefer solutions based on case-when, my assumption is that it should have the least impact on possible performance drop compared to other possible solutions like those with cross-apply, values(), custom functions etc.

    Here is the case-when version that handles null values with most of possible test cases:

    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
    ;
    

    and the result is:

    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
    
    0 讨论(0)
  • 2020-11-22 02:31

    I do not know if it is on SQL, etc... on M$ACCESS help there is a function called MAXA(Value1;Value2;...) that is supposed to do such.

    Hope can help someone.

    P.D.: Values can be columns or calculated ones, etc.

    0 讨论(0)
  • 2020-11-22 02:32

    From SQL Server 2012 we can use 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
    
    0 讨论(0)
提交回复
热议问题