>

테이블이 이와 같은 요구 사항이 있습니다

Id   code        TDate          Amount
--------------------------------------------
1    A01        11/23/2018       100.20
2    A02        10/25/2018        20.20
3    B01        11/24/2018        10.10
4    C01        11/25/2018        22.12  
4    D01        11/21/2018        22.12

그룹 (A01, A02)에서 LATEST_DT_A로 (B01, C01, D01)에서 LATEST_DT_X로 최신 날짜를 얻고 싶습니다. 여기서 코드는 잘 정의되고 수정되었습니다. 각 그룹에서 최신 날짜를 선택하고 싶습니다.

이 테이블에는 많은 양의 데이터가 있으며 사용 사례 설명이 시간 초과되었습니다.

출력은

Id   LATEST_DT_A    LATEST_DT_X
------------------   ---------
1    11/23/2018      11/25/2018


  • 답변 # 1

    조건부 집계를 사용할 수 있다고 생각합니다 :

    select max(case when code like 'A%' then tdate end) as latest_dt_a,
           max(case when code not like 'A%' then tdate end) as latest_dt_x
    from t;
    
    

  • 답변 # 2

    조건부 집계를 다음과 같이 사용하십시오 :

    with tab(Id,code, TDate) as
              (
               select 1,'A01','2018-11-23' union all
               select 2,'A02','2018-10-25' union all              
               select 3,'B01','2018-11-24' union all              
               select 4,'C01','2018-11-25' union all
               select 4,'D01','2018-11-21'              
              )
       select min(Id) as id,
              max( case when substring(code,1,1) ='A' then TDate end )
              as latest_dt_a,
              max( case when substring(code,1,1)!='A' then TDate end )
              as latest_dt_x
         from tab;
    
    

    레스터 에스테르 데모

    P.S.Oracle데이터베이스의 경우 from dual 를 추가하십시오.   union all 전에  키워드. substring 교체   substr 와 함께 ,

    MySQL의 경우 with tab() as ( .... ) 부분을 제거하십시오.

  • 답변 # 3

    Common Table Expression 를 사용할 수 있습니다 CASE  그리고 MAX()  :

    CREATE TABLE #Temp
    (
        Id  INT
        ,Code   VARCHAR(10)
        ,TDate  DATE
        ,Amount NUMERIC(18,2)
    );
    INSERT INTO #Temp
    VALUES
     (1,'A01','11/23/2018',100.20)
    ,(2,'A02','10/25/2018', 20.20)
    ,(3,'B01','11/24/2018', 10.10)
    ,(4,'C01','11/25/2018', 22.12) 
    ,(4,'D01','11/21/2018', 22.12);
    
    WITH CTE AS
    (
        SELECT  Id
                ,CASE WHEN Code IN ('A01','A02') THEN TDate ELSE NULL END LATEST_DT_A 
                ,CASE WHEN Code IN ('B01','C01','D01') THEN TDate ELSE NULL END LATEST_DT_X  
        FROM #Temp
    )
    SELECT  MIN(Id) Id
            ,MAX(LATEST_DT_A) LATEST_DT_A 
           ,MAX(LATEST_DT_X) LATEST_DT_X 
    FROM CTE
    
    

    또는 간단히 CASE  그리고 MAX()

    SELECT   MIN(Id) Id
            ,MAX(CASE WHEN Code IN ('A01','A02') THEN TDate ELSE NULL END) LATEST_DT_A 
            ,MAX(CASE WHEN Code IN ('B01','C01','D01') THEN TDate ELSE NULL END) LATEST_DT_X  
    FROM #Temp
    
    

관련 자료

  • 이전 Atom 편집기에 접미사를 추가하여 코드를 올바르게 표시
  • 다음 docker-compose - 루트가 아닌 사용자가 사용할 수있는 tmpfs 마운트