mssql RANK에 대하여

서세윤·2025년 1월 20일

현재 기존 레거시 코드를 수정중에있다.

사실 코드라기보단 오래된 SQL들을 수정중이다..

가장 대표적으로는
DECARE 변수 선언 후 OPEN CURSOR로 루프를 돌리며 하나하나 INSERT나 UPDATE를 해주는 쿼리가 있는데 이게 가독성이나, 유지보수면에서 굉장히 어려운 점이 있엇다.

그중 대표적인 부분은 학생들 점수를 산정 후 순위를 매기는 쿼리였는데
과거엔 방법중 2가지의 선택지가 있엇던것 같다.

1.SELECT 후 결과를 EOF 루프를 돌리며 다시 INSERT 쿼리를 전송하는것
2.DECARE 후 OPEN CURSOR를 이횽하는것

그중 2번을 택한것 같다.

사실 지금와서 코드를 보면 UPDATE ~ SELECT 하면 가독성도 쉽고, 쿼리도 굉장히 짧아질듯 한데.. 저때는 여러모로 정보의 부재가 컷던것 같다.

UPDATE ~ SELECT 를 하며, 순위를 매기는 쿼리중 가장 중요한 구문은 RANK() 함수이다.

RANK() 는 OVER()와 같이 쓰이며,
RANK() OVER(ORDER BY ~~ [desc,asc]) as ranking
으로 사용할 수 있다.

그러나 나는 학년마다 순위를 매겨주었어야 했기때문에 OVER에 PARTITION BY를 추가해줬다.

완성된 랭킹 구문은 아래와 같다

RANK() OVER(PARTITION BY grade ORDER BY score) as RANKING

이로써 쿼리와 선언, 루프 등 복잡하게 있던 코드들이 1줄로 해결이 되었다.

profile
개잡부..

0개의 댓글