Database

[MySQL] 테이블 분할 & 분석(PARTITION BY)

웨일파도 2023. 11. 25. 19:33
반응형
순위함수를 이용하여 순위 매기기
SELECT 컬럼 이름, 순위함수() OVER (ORDER BY 컬럼이름)
FROM 테이블 이름

 

순위함수 설명
RANK() 중복 순위 적용, 다음 순위가 중복 순위 적용 후 순위 
예) 1, 2, 2, 4
DENSE_RANK() 중복 순위 적용, 다음 순위는 중복 순위 적용 + 1
예) 1, 2, 2, 3

 

이전 행, 다음 행 가져오기
SELECT 컬럼이름, 이동함수(컬럼이름, offset) OVER (ORDER BY 컬럼이름)
FROM 테이블이름
이동함수 설명
LAG() 이전 행 가져오기
LEAD() 다음 행 가져오기

 

테이블 분할 & 분석(PARTITION BY)
SELECT 컬럼이름, 함수() OVER(PARTITION BY 컬럼이름 [ORDER BY 컬럼이름])
FROM 테이블이름

 

테이블 분할 & 분석(FRAME절)
SELECT 컬럼이름, 함수() OVER (ORDER BY 컬럼이름 ROWS BETWEEN [FRAME절] AND [FRAME 절]
FROM 테이블이름
Frame 절 명령어 설명
CURRENT ROW 현재 로우
n PRECEDING n번째 뒤의 로우
n FOLLOWING n번째 앞의 로우
UNBOUNDED PRECEDING 가장 첫번째 로우
UNBOUNDED FOLLOWING 가장 마지막 로우

 

 


 

1. Financial_Info 테이블에서 각 연도별 총자산 순위를 구해보세요.(내림차순)

SELECT *, RANK() OVER(PARTITION BY FiscalPrd_ ORDER BY VALUE_ DESC) 순위
FROM financial_info
WHERE NAME_ = 'TOTAL ASSETS';

 

2. StockETF_Price 테이블에서 삼성전자의 5일 /20일 이동평균 값을 구해보세요

SELECT ID, MarketDate, CLOSE_,
		AVG(Close_) OVER (ORDER BY MarketDate
			ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) MA5,
		AVG(Close_) OVER (ORDER BY MarketDate
			ROWS BETWEEN 19 PRECEDING AND CURRENT ROW) MA20
FROM stocketf_price
WHERE ID = 40853 -- 삼성전자 ID
ORDER BY MarketDate;

 

 

3. Financial_Info 테이블에서 각 기업별로 전년도 대비 Pretax_Income 증감률을 확인해보세요

SELECT CODE, NAME_, FiscalPrd_, VALUE_ '이번금액', 
	LAG(VALUE_, 1) OVER (PARTITION BY CODE ORDER BY FiscalPrd_) '이전금액',
    (Value_ - LAG(VALUE_, 1) OVER (PARTITION BY CODE ORDER BY FiscalPrd_)) / ABS(LAG(VALUE_, 1) OVER (PARTITION BY CODE ORDER BY FiscalPrd_)) '증감률'
FROM financial_info
WHERE NAME_ ='PRETAX INCOME'
ORDER BY CODE, FiscalPrd_;

 

반응형