와 벌써 27강 매일 해낸나 대단해

 

--rank() over(partition by 그룹필드명 order by 정렬필드명)
--dense_rank() over (partition by 그룹필드명 order by 정렬필드명)

SELECT last_name||' '||first_name as 직원이름
    , salary 급여
    , rank() over (order by salary desc) as 순위1 --샐러리 기준으로 급여가 가장높은사람이 1순위로 나오도록/ 중복이있는경우 해당하는 순위가 같이 올라가게 됨. 
    , dense_rank() over (order by salary desc) as 순위2  --중복있어도 연속된 숫자로 순위 매기고 싶을때 
FROM employees ;

 /*WHERE rank() over (order by salary desc) = 2 2순위만 출력하려고 해서 이렇게 where에 윈도우함수를 사용하면 에러남. 
 이렇기때문에 이걸 하위쿼리로 사용하고 추가적으로 상위쿼리를 작성해서 결과를 추출해야 한다. */
 --급여를 가장 많이 받는사람 기준으로 순위 매겨보기 rank함수 사용


select *
from (
            SELECT last_name||' '||first_name as 직원이름
            , salary 급여
            , rank() over (order by salary desc) as 순위1 --
            , dense_rank() over (order by salary desc) as 순위2 
               FROM employees 
                ) A
WHERE 순위1 = 2
;
--4개의 컬럼을 하나의 테이블로 생각해주고, 어떤 작업을 하겠다는 시작점을 바깡트로 나와서 파생으로 만든 내 데이터의 원본을 쓴다고 생각하면 편함.
--하위쿼리에 메인로직이 들어있고, 상위쿼리에서 전체를 호출해주는 개념으로 생각
--파생컬럼을 만들어서 조인도 할수있고 다양한 방법으로 from절 서브쿼리를 확장해서 활용할수있다. 


--사원테이블에서 부서번호기준으로 대상자의 급여순위 구하기
select last_name||' '||first_name as 직원이름
    ,salary 급여
    ,department_id as 부서번호
    ,dense_rank() over(partition by department_id order by salary desc) as 순위2
    from employees;
--이 매긴 순위를 바타응로 사원테이블의 부서별 1순위대상자를 우수사원이라는 컬럼으로 표기할거다. (조인을 해야하고, 서브쿼리를 사용해야 한다)
select A.부서번호, A.직원이름, A.순위
FROM (
select last_name||' '||first_name as 직원이름
    ,salary 급여
    ,department_id as 부서번호
    ,dense_rank() over(partition by department_id order by salary desc) as 순위
    from employees
    ) A
WHERE A.순위 = 1;


--이 부서번호 결과를 가지고 사원테이블의 대상과 결과를 조인해줄거임. !
--EMPLOYEES의 부서ID를 기준으로 부서별 최고 우수사원의 이름을 보여줄거임. JOIN필요
SELECT B.직원이름 AS 우수사원명 , A.*
FROM EMPLOYEES A
        LEFT OUTER JOIN (
                        select A.부서번호, A.직원이름, A.순위
                        FROM (
                        select last_name||' '||first_name as 직원이름
                            ,salary 급여
                            ,department_id as 부서번호
                            ,dense_rank() over(partition by department_id order by salary desc) as 순위
                            from employees
                            ) A
                        WHERE A.순위 = 1
                        ) B
        ON A.DEPARTMENT_ID = B.부서번호
        ;

+ Recent posts