💡순위 함수
순위 함수는 rownum기반으로 만들어진 함수이다.
rownum에 대해서는 위 글을 참고하도록 하자.
💡rank() over(order by 컬럼명 [asc|desc])
급여순으로 가져오는 쿼리를 작성해보도록 하자.
rownum을 이용하는 방법
--rownum
SELECT name, buseo, basicpay, rownum
FROM (SELECT name, buseo, basicpay FROM tblInsa ORDER BY basicpay DESC);
rank() over()를 이용하는 방법
SELECT
name, buseo, basicpay,
rank() over(ORDER BY basicpay desc) AS rnum
FROM tblInsa;
rank 괄호 안에는 아무것도 안 넣고, over 괄호 안에 내가 원하는 정렬을 넣으면 된다.
rownum을 이용한 정렬을 함수형으로 작성하는 게 rank() over()을 이용하는 구문이다.
rank() over()는 동급일 경우 순위를 같게 하며, 그다음 순위에 영향을 준다.
💡dense_rank() over(order by 컬럼명 [asc|desc])
SELECT
name, buseo, basicpay,
dense_rank() over(ORDER BY basicpay desc) AS rnum
FROM tblInsa;
dense_rank() over()는 동급인 경우 순위를 같게 하며, 다음 순위에 영향을 주지 않는다.
💡row_number() over(order by 컬럼명 [asc|desc])
SELECT
name, buseo, basicpay,
row_number() over(ORDER BY basicpay desc) AS rnum
FROM tblInsa;
row_number() over()는 순위에 중복을 허용하지 않는다.
급여 8위인 직원
SELECT * FROM (SELECT
name, buseo, basicpay,
row_number() over(ORDER BY basicpay desc) AS rnum
FROM tblInsa)
WHERE rnum = 8;
select문을 from절에 넣어서 where절로 조건을 비교하여 급여가 8위인 직원을 구할 수 있다.
💡partition by
SELECT
name, buseo, basicpay,
rank() over(PARTITION BY buseo ORDER BY basicpay DESC) AS rnum
FROM tblInsa;
partition by는 키워드는 다르지만 group by라고 생각하면 된다.
partition by는 순위를 매기고자 그룹을 짓는 것이다.
위 코드에서는 부서를 기준으로 partition을 매겼으므로 부서별로 그룹 되어 순위가 매겨진다.
각 부서별 1등
SELECT * FROM (SELECT
name, buseo, basicpay,
rank() over(PARTITION BY buseo ORDER BY basicpay desc) AS rnum
FROM tblInsa)
WHERE rnum = 1;
partition by를 이용하면 부서별로 급여가 1등인 직원만을 가져올 수 있다.
이처럼 그룹별로 순위를 매겨야 할 때, partition by를 떠올리도록 하자.