본문 바로가기
통계프로그램 비교 시리즈/프로그래밍비교(Oracle,Python,R,SAS)

[데이터 추출] 관측치 최대값(MAX) 리스트 추출 - 107

by 기서무나구물 2022. 12. 4.

포스팅 목차

     

    107. Display the name of those employees who are getting highest salary.

     

    * 최대 급여 수령자의 정보를 출력하시오.


    • Oracle : Max()
    • 파이썬 Pandas : nlargest()
    • R 프로그래밍 : order(), row_number()
    • R Dplyr Package : slice_max(), top_n()
    • R sqldf Package : ROW_NUMBER()
    • Python pandasql Package : Max()
    • R data.table Package : order()
    • SAS Proc SQL : max(), HAVING MAX(), MONOTONIC()
    • SAS Data Step : PROC RANK, N
    • Python Dfply Package : row_number(), min_rank(), nth(), first()
    • 파이썬 Base 프로그래밍 :

     


    1. Oracle(오라클)

    서브쿼리를 사용하여서 EMP 테이블에서 최대 급여를 검색 후 EMP테이블에서 최대 급여를 수령하는 직원의 정보를 출력한다.

     

    Oracle Programming
    select empno,ename,sal 
    from   emp 
    where  sal = (select max(sal) from emp);

     


    2. Python Pandas(파이썬)

    nlargest() 함수를 사용하여 EMP 테이블에서 최대 급여를 수령하는 직원의 정보를 출력한다.

     

    Python Programming
    emp.nlargest(1, 'sal')

     

     


    Results
      empno ename job mgr hiredate sal comm deptno
    8 7839 KING PRESIDENT NaN 1981/11/17 5000 NaN 10

     


    3. R Programming (R Package)

    emp 테이블을 급여를 기준으로 내림차순으로 정렬 후 최대 급여를 수령하는 직원의 정보를 출력한다.

    R Programming
    %%R
    
    emp[order(-emp$sal),][1:1, ]

     

     

    Results
    # A tibble: 1 x 8
      empno ename job         mgr hiredate     sal  comm deptno
      <dbl> <chr> <chr>     <dbl> <date>     <dbl> <dbl>  <dbl>
    1  7839 KING  PRESIDENT    NA 1981-11-17  5000    NA     10

     


    row_number 함수를 사용하여서 emp 테이블을 급여를 기준으로 내림차순으로 정렬 후 최대 급여를 수령하는 직원의 정보를 출력한다.

     

    R Programming
    %%R
    
    filter(emp, row_number(desc(sal)) <= 1)

     

     

    Results
    # A tibble: 1 x 8
      empno ename job         mgr hiredate     sal  comm deptno
      <dbl> <chr> <chr>     <dbl> <date>     <dbl> <dbl>  <dbl>
    1  7839 KING  PRESIDENT    NA 1981-11-17  5000    NA     10

     


    4. R Dplyr Package

    slice_max() 함수를 사용하여서 EMP 테이블에서 최대 급여를 수령하는 직원의 정보를 출력한다.

     

    R Programming
    %%R
    
    emp %>% 
      slice_max(sal, n = 1)

     

     

    Results
    # A tibble: 1 x 8
      empno ename job         mgr hiredate     sal  comm deptno
      <dbl> <chr> <chr>     <dbl> <date>     <dbl> <dbl>  <dbl>
    1  7839 KING  PRESIDENT    NA 1981-11-17  5000    NA     10

     


    top_n() 함수를 사용하여서 EMP 테이블에서 최대 급여를 수령하는 직원의 정보를 출력한다.

     

    R Programming
    %%R
    
    emp %>% 
      top_n(1, sal)

     

     

    Results
    # A tibble: 1 x 8
      empno ename job         mgr hiredate     sal  comm deptno
      <dbl> <chr> <chr>     <dbl> <date>     <dbl> <dbl>  <dbl>
    1  7839 KING  PRESIDENT    NA 1981-11-17  5000    NA     10

     


    5. R sqldf Package

    서브쿼리를 사용하여서 EMP 테이블에서 최대 급여를 검색 후 EMP테이블에서 최대 급여를 수령하는 직원의 정보를 출력한다.

     

    R Programming
    %%R
    
    sqldf(" select empno,ename,sal 
            from   emp 
            where  sal = (select max(sal) from emp);")

     

     

    Results
      empno ename  sal
    1  7839  KING 5000

     


    ROW_NUMBER() 함수를 사용하여서 emp 테이블을 급여를 기준으로 내림차순으로 정렬 후 급여 최대 급여를 수령하는 직원의 정보를 출력한다.

     

    R Programming
    %%R
    
    sqldf("select *
           from   ( select *, ROW_NUMBER() OVER(ORDER BY sal desc) AS row_rank from emp )
           where  row_rank = 1")

     

     

    Results
      empno ename       job mgr   hiredate  sal comm deptno row_rank
    1  7839  KING PRESIDENT  NA 1981-11-17 5000   NA     10        1

     


    6. Python pandasql Package

     

    Python Programming
    ps.sqldf(" select empno,ename,sal                    \
               from   emp                                \
               where  sal = (select max(sal) from emp);")

     

     

    Results
      empno ename sal
    0 7839 KING 5000

     


    7. R data.table Package

    emp 테이블을 급여를 기준으로 내림차순으로 정렬 후 최대 급여를 수령하는 직원의 정보를 출력한다.

     

    R Programming
    %%R
    
    DT          <- data.table(emp)
    dept_DT     <- data.table(dept)
    salgrade_DT <- data.table(salgrade)
    
    DT[order(-DT$sal),][1:1, ]

     

     

    Results
       empno ename       job mgr   hiredate  sal comm deptno
    1:  7839  KING PRESIDENT  NA 1981-11-17 5000   NA     10

     


    8. SAS Proc SQL

     

    SAS Programming
    %%SAS sas
    
    PROC SQL;
      CREATE TABLE STATSAS_1 AS
        select empno,ename,sal 
        from   emp 
        where  sal=(select max(sal) from emp);
    QUIT;
    PROC PRINT;RUN;

     

     


    Results
    OBS empno ename sal
    1 7839 KING 5000

     


     

    SAS Programming
    %%SAS sas
    
    PROC SQL;
      create table STATSAS_2 as
        SELECT A.*
        FROM   EMP A
        HAVING MAX(A.SAL) = A.SAL;
    QUIT;
    PROC PRINT;RUN;

     


    Results
    OBS empno ename job mgr hiredate sal comm deptno
    1 7839 KING PRESIDEN . 1981-11-17 5000 . 10

     


    • PROC SQL로 구현(사전 PROC SORT);
    SAS Programming
    %%SAS sas
    
    PROC SQL;
      CREATE TABLE EMP_1 AS
        select e.*
        from   emp e 
        order 
           by  sal;
    
      CREATE TABLE STATSAS_3 AS
        SELECT A.*,
               MONOTONIC()      AS VAR3,
               MAX(MONOTONIC()) AS VAR4
        FROM   EMP_1 A
        HAVING MONOTONIC() = MAX(MONOTONIC());
    quit;
    PROC PRINT;RUN;

     

     

    Results
    OBS empno ename job mgr hiredate sal comm deptno VAR3 VAR4
    1 7839 KING PRESIDEN . 1981-11-17 5000 . 10 1 14

     


    9. SAS Data Step

    RANK 프로시져 사용;

    SAS Programming
    %%SAS sas
    
    PROC RANK DATA=EMP OUT=STATSAS_4(WHERE=(RANK=1)) DESCENDING;
         RANKS RANK;
         VAR SAL ;
    RUN;
    PROC PRINT;RUN;

     

     


    Results
    OBS empno ename job mgr hiredate sal comm deptno RANK
    1 7839 KING PRESIDEN . 1981-11-17 5000 . 10 1

     


     

    SAS Programming
    %%SAS sas
    
    PROC SORT DATA=EMP OUT=EMP_1;
         BY DESCENDING SAL;
    RUN;
    DATA STATSAS_5;
     SET EMP_1;
         BY DESCENDING SAL;
         IF _N_ = 1;
    RUN;
    PROC PRINT;RUN;

     

     

    Results
    OBS empno ename job mgr hiredate sal comm deptno
    1 7839 KING PRESIDEN . 1981-11-17 5000 . 10

     


    10. Python Dfply Package

    row_number() 함수

    Python Programming
    emp >> mutate(row_rank=row_number(X.sal, ascending=False)) >> filter_by(X.row_rank == 1)

     


    Results
      empno ename job mgr hiredate sal comm deptno row_rank
    8 7839 KING PRESIDENT NaN 1981/11/17 5000 NaN 10 1.0

     


    min_rank() 함수

    Python Programming
    emp >> mutate(row_rank=min_rank(X.sal, ascending=False)) >> filter_by(X.row_rank == 1)

     

    Results
      empno ename job mgr hiredate sal comm deptno row_rank
    8 7839 KING PRESIDENT NaN 1981/11/17 5000 NaN 10 1.0

     


    [참고] nth() 함수

    Python Programming
    emp >> arrange(~X.sal) >>  summarize(sal_1th = nth(X.sal,0))

    Results
      sal_1th0
    0 5000

     


    Python Programming
    emp >> arrange(~X.sal) >>  summarize(sal_1th = first(X.sal))

    Results
      sal_1th0
    0 5000

     


    [SQL, Pandas, R Prog, Dplyr, SQLDF, PANDASQL, DATA.TABLE]   SQL EMP 예제로 만나는 테이블 데이터 전처리 방법 리스트

    반응형

    댓글