MySQL의 사용자 정의 변수를 이용하여 Oracle 분석 함수 RANK를 구현하는 방법

7307 단어 MySQLSQL오로라
오라클에 RANK()라는 분석 함수가 있지만, 그것을 MySQL, Aurora로 변환하는 방법을 소개합니다.

RANK() OVER(ORDER BY)



오라클로 쓸 경우, 이런 느낌입니다. (※급료(salary)의 내림차순으로 랭킹)
SELECT
    emp_id,dept_id,job_id,salary,
    RANK()OVER(ORDER BY salary DESC) AS rank 
FROM emp;

실행 결과:


MySQL로 변환하는 경우, 사용자 정의 변수와 IF(expr1,expr2,expr3) 함수로 실현합니다.
생각은 다음과 같습니다.
1. salary로 내림차순 정렬합니다.
2. 추출 레코드에 일련 번호를 붙인다. ←tmp1
3. 현재 행의 salary = 이전의 salary의 경우 이전의 salary와 동일한 순위로 설정합니다.
  current행의 salary != 1전의 salary의 경우, 랭크에 일련번호를 설정한다.
SELECT
    emp_id, dept_id, job_id, salary,
    IF(salary=@_last_salary,@curRank:=@curRank,@curRank:=@_sequence) AS rank,
    @_sequence:=@_sequence+1 as tmp1,
    @_last_salary:=salary as tmp2
FROM      emp a, (SELECT @curRank := 1, @_sequence:=1) r
ORDER BY  salary desc;

실행 결과:


RANK() OVER(PARTITION BY ORDER BY)



오라클로 쓸 경우, 이런 느낌입니다. (※부문(dept_id)마다 급료(salary)의 내림차순으로 랭킹)
SELECT 
    emp_id,dept_id,job_id,salary,
    RANK()OVER(PARTITION BY DEPT_ID ORDER BY salary DESC) AS rank
FROM emp;

실행 결과:


MySQL로 다시 작성하는 경우, 생각은 기본적으로 위와 함께입니다.
다른 점은 부서(dept_id)가 바뀌면 랭크를 1부터 다시 되돌리는 것입니다.
SELECT
    emp_id, dept_id, job_id, salary,
    IF(dept_id=@_last_dept_id,
        IF(salary=@_last_salary,@curRank:=@curRank,@curRank:=@_sequence),
    @_sequence:=1) AS rank,
    @_sequence:=@_sequence+1 as tmp1,
    @_last_salary:=salary as tmp2,
    @_last_dept_id:=dept_id as tmp3
FROM      emp a, (SELECT @curRank := 1, @_sequence:=1) r
ORDER BY  dept_id asc, salary desc;

실행 결과:

좋은 웹페이지 즐겨찾기