복붙노트

[SQL] 여러 열의 SQL MAX?

SQL

여러 열의 SQL MAX?

어떻게 여러 컬럼의 최대의 행당 1 개 값을 반환 할 :

TABLENAME

[Number, Date1, Date2, Date3, Cost]

나는 이런 식으로 뭔가를 반환해야합니다

[Number, Most_Recent_Date, Cost]

질문?

해결법

  1. ==============================

    1.글쎄, 당신은 CASE 문을 사용할 수 있습니다 :

    글쎄, 당신은 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
    

    [위 마이크로 소프트 SQL 서버 2008의 경우, 아래의 스벤의 간단한 대답을 고려할 수 있습니다.]

  2. ==============================

    2.여기에 T-SQL 및 SQL Server를 사용하여 최대 기능에 대한 또 다른 좋은 솔루션입니다

    여기에 T-SQL 및 SQL Server를 사용하여 최대 기능에 대한 또 다른 좋은 솔루션입니다

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

    3.당신이 MySQL을 사용하는 경우 사용할 수 있습니다

    당신이 MySQL을 사용하는 경우 사용할 수 있습니다

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

    4.시뮬레이션 피벗 해제 다음 UNPIVOT (1) 지금까지 가장 빠른 3 개 방법이 있습니다 훨씬 느린 (1)에 비해 여전히보다 빠른 (3) (2)

    시뮬레이션 피벗 해제 다음 UNPIVOT (1) 지금까지 가장 빠른 3 개 방법이 있습니다 훨씬 느린 (1)에 비해 여전히보다 빠른 (3) (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
    
    SELECT  number ,
            MAX(dDate) maxDate ,
            cost
    FROM    dates UNPIVOT ( dDate FOR nDate IN ( Date1, Date2,
                                                Date3 ) ) as u
    GROUP BY number ,
            cost 
    GO
    
    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
    
    ;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
    
  5. ==============================

    5.어느 의지 작업 아래 두 샘플의 :

    어느 의지 작업 아래 두 샘플의 :

    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의 대답이다.

    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 
    
  6. ==============================

    6.T-SQL의 경우 (MSSQL 2008+)

    T-SQL의 경우 (MSSQL 2008+)

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

    7.성능 문제의 모든 종류의 원인 스칼라 함수, 가능하면 인라인 테이블 반환 함수에 논리를 포장하는 그것의 더 나은 있도록. 이것은 내가 10 일자 개까지의 목록에서 최소 / 최대 날짜를 선택 일부 사용자 정의 기능을 대체하는 데 사용되는 기능입니다. 1 백만 행 내 데이터 세트에서 테스트 할 때 나는 인라인 TVF는 임시 테이블에 결과 집합을 선택하는 것과 동일한 양의 시간을 1 분했다 쿼리를 살해하기 전에 스칼라 기능을 통해 15 분 걸렸다. 하여 SELECT 또는 CROSS 적용에서 하위 쿼리에서이 호출에게 기능을 사용하십시오.

    성능 문제의 모든 종류의 원인 스칼라 함수, 가능하면 인라인 테이블 반환 함수에 논리를 포장하는 그것의 더 나은 있도록. 이것은 내가 10 일자 개까지의 목록에서 최소 / 최대 날짜를 선택 일부 사용자 정의 기능을 대체하는 데 사용되는 기능입니다. 1 백만 행 내 데이터 세트에서 테스트 할 때 나는 인라인 TVF는 임시 테이블에 결과 집합을 선택하는 것과 동일한 양의 시간을 1 분했다 쿼리를 살해하기 전에 스칼라 기능을 통해 15 분 걸렸다. 하여 SELECT 또는 CROSS 적용에서 하위 쿼리에서이 호출에게 기능을 사용하십시오.

    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)
    )
    
  8. ==============================

    8.

    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
    
  9. ==============================

    9.

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

    이 밖에 쓸 약간 쉽게 케이스 문이 순서대로 평가대로 평가 단계를 건너 뜁니다.

  10. ==============================

    10.불행하게도 라세의 대답은, 그러나 겉으로는 분명, 중요한 결함이있다. 그것은 NULL 값을 처리 할 수 ​​없습니다. 날짜 1에서 모든 단일 NULL 값의 결과가 반환된다. 그 문제를 해결하기 위해 불행하게도 시도는 매우 혼란스러워하는 경향이 매우 잘 4 개 이상의 값으로 확장되지 않습니다.

    불행하게도 라세의 대답은, 그러나 겉으로는 분명, 중요한 결함이있다. 그것은 NULL 값을 처리 할 수 ​​없습니다. 날짜 1에서 모든 단일 NULL 값의 결과가 반환된다. 그 문제를 해결하기 위해 불행하게도 시도는 매우 혼란스러워하는 경향이 매우 잘 4 개 이상의 값으로 확장되지 않습니다.

    databyss의 첫 번째 대답은 좋은 모습 (하고있다). 그러나 대답은 다중 테이블에서 쉽게 외삽 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
    
  11. ==============================

    11.문제 : 엔티티에 주어진 최소 속도 값을 선택 요구 사항 : 기관 비율은 null이 될 수 있습니다

    문제 : 엔티티에 주어진 최소 속도 값을 선택 요구 사항 : 기관 비율은 null이 될 수 있습니다

    [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 
    

    냇에서이 답변에서 영감을

  12. ==============================

    12.당신은 SQL 서버 2005를 사용하는 경우, 당신은 UNPIVOT 기능을 사용할 수 있습니다. 여기에 완벽한 예입니다 :

    당신은 SQL 서버 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
    
  13. ==============================

    13.CROSS은 (2005 + 용) 적용하여 ....

    CROSS은 (2005 + 용) 적용하여 ....

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

    14.SQL 서버 2012에서 우리는 IIF를 사용할 수 있습니다.

    SQL 서버 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
    
  15. ==============================

    15.UNPIVOT을 사용하여 보시기 바랍니다 :

    UNPIVOT을 사용하여 보시기 바랍니다 :

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

    16.내 가정이있는 사람과 같은 다른 가능한 솔루션에 비해 가능한 성능 저하에 미치는 영향을 최소화해야한다는 것입니다 내가 기반으로 솔루션을 선호하는 경우 대소, 값 (), 사용자 정의 함수 등을 단면적을 적용

    내 가정이있는 사람과 같은 다른 가능한 솔루션에 비해 가능한 성능 저하에 미치는 영향을 최소화해야한다는 것입니다 내가 기반으로 솔루션을 선호하는 경우 대소, 값 (), 사용자 정의 함수 등을 단면적을 적용

    여기서, 케이스 - 인 경우 버전 핸들 가능한 테스트 케이스 가장 Null 값한다 :

    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
    
  17. ==============================

    17.당신은 당신이 날짜를 전달한 함수를 만든 다음 아래와 같이 select 문에 기능을 추가 할 수 있습니다. 번호, dbo.fxMost_Recent_Date (날짜 1, 날짜 2, Date3) 비용을 선택

    당신은 당신이 날짜를 전달한 함수를 만든 다음 아래와 같이 select 문에 기능을 추가 할 수 있습니다. 번호, dbo.fxMost_Recent_Date (날짜 1, 날짜 2, Date3) 비용을 선택

    create FUNCTION  fxMost_Recent_Date 
    

    (     @ 날짜 1 smalldatetime으로,     @ DATE2 smalldatetime으로,     @ Date3 smalldatetime으로 ) RETURNS는 SMALLDATETIME 같이 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
    

    종료

  18. ==============================

    18.http://www.experts-exchange.com/Microsoft/Development/MS-SQL-Server/Q_24204894.html에서 ScottPletcher의 솔루션을 기반으로 나는 UNION ALL을 사용하여 최대 13 개 날짜 값의 최대 찾는 기능 (예를 들어 GetMaxOfDates3, GetMaxOfDates13)의 집합을 만들었습니다. 같은 행에서 값의 최대를 얻기 위해 T-SQL 함수를 참조 이러한 기능을 작성하는 시간 그러나 내가 고려하지 않은 UNPIVOT 솔루션

    http://www.experts-exchange.com/Microsoft/Development/MS-SQL-Server/Q_24204894.html에서 ScottPletcher의 솔루션을 기반으로 나는 UNION ALL을 사용하여 최대 13 개 날짜 값의 최대 찾는 기능 (예를 들어 GetMaxOfDates3, GetMaxOfDates13)의 집합을 만들었습니다. 같은 행에서 값의 최대를 얻기 위해 T-SQL 함수를 참조 이러한 기능을 작성하는 시간 그러나 내가 고려하지 않은 UNPIVOT 솔루션

  19. ==============================

    19.사용 CASE 때 또 다른 방법

    사용 CASE 때 또 다른 방법

    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
    
  20. ==============================

    20.여기에 좋은 솔루션입니다 :

    여기에 좋은 솔루션입니다 :

    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 
    
  21. ==============================

    21.(; 값 2; ... 값 1) 등을 수행하도록되어이 M $ ACCESS 도움에 ... 등 SQL에 있다면 나는 MAXA라는 함수가 모른다.

    (; 값 2; ... 값 1) 등을 수행하도록되어이 M $ ACCESS 도움에 ... 등 SQL에 있다면 나는 MAXA라는 함수가 모른다.

    희망은 사람을 도울 수 있습니다.

    P.D : 값 등 열 또는 계산 사람이 될 수 있습니다

  22. from https://stackoverflow.com/questions/71022/sql-max-of-multiple-columns by cc-by-sa and MIT license