본문 바로가기

Study/class note

sql 중급 / 순위출력정리

ㅁ 복습

1.rownum

2. row_number()

3. order by 컬럼명 desc fetch first 3 rows only

 

 

ㅇ정렬된 결과에서 상위 몇 개의 데이터를 가져오는 방법

1. order by 컬럼명 asc/desc fetch first 숫자 rows only;

2. order by 컬럼명 asc/desc fetch first 숫자 percent rows only;

 

문제272. 우리반에서 통신사가 kt인 학생들 중에서 나이가 높은 학생순으로 상위 20%에 해당하는 학생들을 출력하시오

select ename, age, lower(telecom)
  from emp14_address
  where lower(telecom) = 'kt'
  order by age desc fetch first 20 percent rows only;

문제273. 사원테이블에서 직업이 SALESMA, ANALYST인 사원들의 이름과 월급과 직업을 출력하는데 이중에서 월급이 상위5%에 해당하는 사원들만 출력하시오

select ename, sal, job
 from emp
 where job in ('SALESMAN', 'ANALYST')
 order by sal desc fetch first 5 percent row only;

문제274. 사원번호, 이름, 직업, 월급을 출력하는데 월급이 높은 사원의 순위가 1등과 2등만 출력하시오

select *
 from (
        select empno, ename, job, sal, rank() over (order by sal desc) 순위
         from emp
      )
 where 순위 in (1,2);
 
/* 이렇게 풀 경우 2명만 나오는거지 2등까지 나오는게 아님
select empno, ename, job, sal
 from emp
 order by sal desc fetch first 2 rows only;
*/

-- 따라서, 동급인 경우 with ties로 작성해야함
select empno, ename, job, sal
 from emp
 order by sal desc fetch first 2 rows with ties;
 /* with ties는 같은 데이터가 있다면 묶어서 같이 나오게 하라는 의미 > 즉, 데이터가 묶임
 순위를 출력할 일이 있으면 그냥 rank를 쓰는게 편함*/

문제275. 위의 결과를 다시 출력하는데 월급의 순위가 3등까지 출력하시오

select *
 from (
  select empno, ename, job, sal, dense_rank() over (order by sal desc) 순위
   from emp
      )
 where 순위 in (1,2,3);
 
 -- fetch는 dense_rank가 아닌 rank로 수행됨

 

ㅁ정리

1. 순위 출력 : rank

2. 정렬된 결과에서 상위 몇 개의 데이터(퍼센트)를 가져오는 경우 : order by fetch

3. 출력된 결과에서 맨 위의 행들을 가져오는 경우 : rownum

-- 월급이 1000에서 3000사이인 사원들의 사원번호, 이름, 월급을 출력하는데 맨 위에 3개 출력하시오
select empno, ename, sal
 from emp
 where sal between 1000 and 3000;
 and rownum <= 3;
 -- rownum은 1~n번까지의 결과만 뽑아낼 수 있음. n번째 결과만 뽑아낼 수 없음

 

반응형