공부/데이터베이스

윈도우 함수

원클릭쓰리버그 2022. 3. 2. 21:36
728x90
USE BaseballData;

-- 윈도우 함수
-- 행들의 서브 집합을 대상으로, 각 행별로 계산을 해서 스칼라(단일 고정)값을 출력하는 함수

-- 느낌상 GROUPING이랑 비슷한가?
-- SUM, COUNT, AVG 집계 함수

SELECT*
FROM salaries
ORDER BY salary DESC;

SELECT playerID, MAX(salary)
FROM salaries
GROUP BY playerID
ORDER BY MAX(salary) DESC

-- 윈도우 함수
-- ~OVER([PARTITION] [ORDER BY] [ROWS])

-- 전체 데이터를 연봉 순서로 나열하고, 순위 표기


SELECT *,
	ROW_NUMBER() OVER (ORDER BY salary	DESC),	-- 행#번호
	RANK() OVER (ORDER BY salary	DESC),		-- 랭킹
	DENSE_RANK() OVER (ORDER BY salary	DESC),	-- 랭킹
	NTILE(100) OVER (ORDER BY salary	DESC)	-- 상위 몇 %
FROM salaries;

--playerID 별 순위를 따로 하고 싶다면
SELECT *,
	ROW_NUMBER() OVER (PARTITION BY playerID ORDER BY salary DESC)
FROM salaries
ORDER BY playerID;

-- LAG(바로 이전), LEAD(바로 다음)
SELECT *,
	RANK() OVER(PARTITION BY playerID ORDER BY salary DESC) AS Ranking,
	LAG(salary) OVER(PARTITION BY playerID ORDER BY salary DESC) AS prevSalary,
	LEAD(salary) OVER(PARTITION BY playerID ORDER BY salary DESC) AS nextSalary	
FROM salaries
ORDER BY playerID;

-- FORST_VALUE, LAST_VALUE
-- FRAME : FIRST~CURRENT
SELECT *,
	RANK() OVER(PARTITION BY playerID ORDER BY salary DESC) AS Ranking,
	FIRST_VALUE(salary) OVER (PARTITION BY playerID
								ORDER BY salary DESC
								ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
								) AS best,
	LAST_VALUE(salary)OVER (PARTITION BY playerID 
							ORDER BY salary DESC
							ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
							) AS worst
FROM salaries
ORDER BY playerID;

'공부 > 데이터베이스' 카테고리의 다른 글

Clustered VS Non-Clustered  (0) 2022.03.11
데이터베이스 세부 인덱스 확인 및 복합 인덱스  (0) 2022.03.09
변수와 흐름제어  (0) 2022.03.02
TRANSACTION  (0) 2022.02.16
JOIN (교차 결합)  (0) 2022.02.09