데.분.레 - 복습 5

SELECT product_id
     , score
     , ROW_NUMBER() OVER(ORDER BY score DESC) AS row
     , SUM(score) OVER(ORDER BY score DESC
                        ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
                        AS cum_score
     , AVG(score) OVER(ORDER BY score DESC
                        ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)
                        AS local_avg
     , FIRST_VALUE(product_id) OVER (ORDER BY score DESC
                                      ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
                                      AS first_value
     , LAST_VALUE(product_id) OVER(ORDER BY score DESC
                                    ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
                                    AS last_value
  FROM popular_products
  ORDER BY row


ORDER BY 구문과 SUM/AVG 등의 집약함수를 조합하면, 집약 함수의 적용 범위를 유연하게 지정할 수 있다.
FIRST_VALUE / LAST_VALUE : 각각 윈도 내부의 가장 첫번째 레코드와 가장 마지막 레코드를 추출해주는 함수.

프레임 지정 구문에는 여러가지 종류가 있다.
가장 기본적인 것은 ROWS BETWEEN start AND end 이다.
start와 end에는 다음과 같은 키워드가 올 수 있다.
CURRENT ROW : 현재의 행
n PRECEDING : n행 앞
n FOLLOWING : n행 뒤
UNBOUNDED PRECEDING : 이전 행 전부
UNBOUNDED FOLLOWING : 이후 행 전부

SELECT category
     , product_id
     , score
     , ROW_NUMBER() OVER(PARTITION BY category 
                         ORDER BY score DESC) AS row
     , RANK() OVER(PARTITION BY category
                   ORDER BY score DESC) AS rank
     , DENSE_RANK() OVER(PARTITION BY category
                         ORDER BY score DESC) AS dense_rank
  FROM popular_products
  ORDER BY category, row

SELECT *
  FROM (SELECT category
             , product_id
             , score
             , ROW_NUMBER() OVER(PARTITION BY category
                                 ORDER BY score DESC) AS rank
          FROM popular_products) AS popular_products_with_rank
  WHERE rank <= 2
  ORDER BY category, rank


카테고리들의 순위 상위 2개까지의 상품을 추출하는 쿼리이다.

SELECT DISTINCT category
     , FIRST_VALUE(product_id) OVER(PARTITION BY category
                                    ORDER BY score DESC
                                    ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
                                    AS product_id
  FROM popular_products

카테고리별 순위 순서에서 상위 1개의 상품 ID를 추출할 경우, 위처럼 FIRST_VALUE 윈도 함수를 사용하고, SELECT DISTINCT 구문으로 결과를 집약해도 된다.

좋은 웹페이지 즐겨찾기