SQL MAX of multiple columns?

后端 未结 22 1858
伪装坚强ぢ
伪装坚强ぢ 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: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
    

提交回复
热议问题