WITH t AS ( SELECT 'A' deptno, '김태희' ename, 100 amt, '00' empno FROM dual UNION ALL SELECT 'A', '김태희', 200, '00' FROM dual UNION ALL SELECT 'A', '김태희', 100, '00' FROM dual UNION ALL SELECT 'A', '쯰위' , 1000, '01' FROM dual UNION ALL SELECT 'A', '쯔위' , 100, '01' FROM dual UNION ALL SELECT 'A', '김희선', 500, '02' FROM dual ) SELECT * FROM (SELECT deptno, empno, ename , SUM(amt) amt , RANK() OVER(PARTITION BY deptno ORDER BY SUM(amt) DESC) rk -- 공동순위 , ROW_NUMBER() OVER(PARTITION BY deptno ORDER BY SUM(amt) DESC, empno) rn -- 단일순위(사번 빠른순) FROM t WHERE deptno = 'A' GROUP BY deptno, empno, ename ) WHERE rn = 1 ;
그룹바이는 요건이 아니라 도구입니다. 도구 사용까지도 제한하나요?
요건을 만족하여 결과를 도출하는 방법은 여러가지일 수 있습니다.
또한 공동 순위에 대한 조건이 모호합니다.
공동순위는 없다 --> 있다면 아무거나?
이런 모호한 조건 말고 명확한 조건이 필요합니다.
금액이 같으면 사번순으로 가져온다던가 하는 조건.
이게 없다면 똑같은 조회를 할때도 결과가 다를 수 있습니다.
공동 1등이 쯔위와 김희선인데
첫번째 조회 때는 쯔위가 나왔다가
두번째 조회 때는 김희선이 나온다면?
이 결과에 대한 신뢰를 잃게 됩니다.
항상 똑같은 결과를 정확하게 도출해 줘야 합니다.
-- 1. 그룹바이 없는 쿼리 SELECT deptno , empno , ename , amt FROM (SELECT deptno, empno, ename , SUM(amt) amt FROM t WHERE deptno = 'A' GROUP BY deptno, empno, ename ORDER BY amt DESC, empno ) WHERE ROWNUM = 1 ; -- 2. 억지로 그룹바이를 넣은 쿼리 SELECT deptno , MIN(empno) empno , MIN(ename) ename , MIN(amt) amt FROM (SELECT deptno, empno, ename , SUM(amt) amt FROM t WHERE deptno = 'A' GROUP BY deptno, empno, ename ORDER BY amt DESC, empno ) WHERE ROWNUM = 1 GROUP BY deptno -- 요건 ;