복붙노트

[SQL] 최대 열 값과 인덱스 값마다 하나 개의 행을 선택

SQL

최대 열 값과 인덱스 값마다 하나 개의 행을 선택

다음 필드와 테이블 설치를 :

SKU, EVENTSTARTDATE, EVENTENDDATE, PRICE, (...etc...)

행의 주택 수천 여기에 예제 데이터입니다 (날짜는 YYMMDD는, 세기의 코드는 제외) :

1111111, 101224, 101231, 10.99
1111111, 110208, 110220, 9.99
1111111, 110301, 110331, 8.99
2222222, 101112, 101128, 15.99
2222222, 101201, 110102, 14.99
etc

나는 절 (모든 SKU에 대한 SKU 당 하나 개의 행을 반환해야 SELECT 문을 원하는)의 SKU의 특정 SKU 또는 불완전한 부분 집합을 분리 WHERE없이 최대 EVENTSTARTDATE으로 SKU 당 SELECT 문 반환 한 행을 가지고 싶습니다. 나는 시작 날짜가 현재 날짜로 동일하고, 종료 날짜보다 크거나 현재 날짜로 동일하지만, 내가 먼저 어딘가에 시작해야보다 작거나이라는 기준을 추가하려면 결국 싶습니다.

예 결과 (지금은 단지 최대 날짜를) 원하는 :

1111111, 110301, 110331, 8.99
2222222, 101201, 110102, 14.99
etc.

해결법

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

    1.DB2의 최신 버전에서, 당신은 () 분석 기능 ROW_NUMBER를 사용할 수 있습니다

    DB2의 최신 버전에서, 당신은 () 분석 기능 ROW_NUMBER를 사용할 수 있습니다

    SELECT * 
    FROM (
        SELECT 
            tablename.*, 
            ROW_NUMBER() OVER (PARTITION BY sku 
                               ORDER BY eventstartdate DESC) As RowNum
            FROM tablename) X 
    WHERE X.RowNum=1
    

    각 파티션 (SKU의 군)의 경우, 데이터는 행이 최신 EventStartDate 1부터 ..., 1,2,3- 있도록 eventstartdate DESC하여 다음 순서 번호이다. WHERE 절은 만 SKU 당 최신 선택합니다.

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

    2.GROUP BY 및 HAVING 절에서보세요.

    GROUP BY 및 HAVING 절에서보세요.

    select sku, max(eventstartdate)
    FROM TABLE
    group by sku
    having eventstartdate <= sysdate
    

    편집 : 문을 HAVING 추가

  3. ==============================

    3.다른 솔루션

    다른 솔루션

     select distinct f3.* 
     from  yourtable f1
     inner join lateral
           (
            select * from yourtable f2
            where f1.SKU=f2.SKU
            order by EVENTSTARTDATE desc, EVENTENDDATE desc
            fetch first rows only
            ) f3 on 1=1
    
  4. from https://stackoverflow.com/questions/4937046/select-one-row-per-index-value-with-max-column-value by cc-by-sa and MIT license