MySQL의 사용자 정의 변수를 이용하여 Oracle 분석 함수 RANK를 구현하는 방법
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;
실행 결과:
Reference
이 문제에 관하여(MySQL의 사용자 정의 변수를 이용하여 Oracle 분석 함수 RANK를 구현하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/KevinFQ/items/8bdbe27b12733c0210eb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)