데.분.레 - 복습 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 구문으로 결과를 집약해도 된다.
Author And Source
이 문제에 관하여(데.분.레 - 복습 5), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@gugu_dragon/데.분.레-복습-5저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)