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

[데이터 추출] 특정 조건을 만족하는 데이터 추출 - 비상관 서브쿼리(max), having count() - 141 (오라클 SQL, R, Python, SAS)

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

포스팅 목차

    141. Display the manager who is having maximum number of employees working under him?

     

    * 관리하고 있는 부서원의 수가 가장 많은 부서를 담당하고 있는 관리자의 정보를 출력하시오.


    • Oracle : having count(), max(count()), ROW_NUMBER() 윈도우 함수, count(), WITH 구문
    • 파이썬 Pandas : groupby(), count(), loc[], count(), max()
    • R 프로그래밍 : subset(), aggregate(), function(x) 사용자 정의 함수, length(), max()
    • R Dplyr Package : dplyr::group_by(), dplyr::summarize() 의 n(), max()
    • R sqldf Package : having count(), count(), max(), ROW_NUMBER() 윈도우 함수, count()
    • Python pandasql Package : having count(), count(), max(), ROW_NUMBER() 윈도우 함수, count()
    • R data.table Package : IF 조건문, max(), .N, .SD(Subset of Dataframe), .N, keyby=, max()
    • SAS Proc SQL : having count(), max(count()), ROW_NUMBER() 윈도우 함수, count()
    • SAS Data Step : Proc summary 의 N=, Set 구문, n, proc rank
    • Python Dfply Package : summarize()의 count(), max()
    • 파이썬 Base 프로그래밍 :

     


    1. Oracle(오라클)

    서브쿼리에서 관리자별로 담당하고 있는 최대 사원수를 집계하여서 해당 관리자의 사원번호를 출력한다.

    Oracle Programming
    Select mgr 
    from   emp 
    group 
       by  mgr 
    having count(*) = (select max(count(mgr)) from emp group by mgr)

     


    인라인뷰(Inline view)에서 관리자 별로 담당하고 있는 사원수(‘mgr_count’)를 집계하고, 집계된 사원수를 내림차순으로 정렬하여서 최대 사원수에 해당하는 row_number() 1번을 선택하여 출력한다.

     

    Oracle Programming
    select *
    from   ( select a.*, ROW_NUMBER() OVER(ORDER BY mgr_count desc) AS row_rank 
             from   (select mgr, count(mgr) mgr_count from emp group by mgr) a )
    where  row_rank = 1

     


    with() 구문에서 관리자 별로 담당하고 있는 사원수(‘mgr_count’)를 집계하고, 집계된 사원수를 내림차순으로 정렬한 후 row_number() 함수를 사용하여서 관측치 번호를 부여후에 메인 쿼리에서 최대 사원수에 해당하는 row_number() 1번을 선택하여 출력한다.

     

    Oracle Programming
    with withmooc as
      ( select a.*, 
               ROW_NUMBER() OVER(ORDER BY mgr_count desc) AS row_rank 
        from   (select mgr, count(mgr) mgr_count from emp group by mgr) a )
    
    select *
    from   withmooc
    where  row_rank = 1

     

     


    2. Python Pandas(파이썬)

    emp테이블에서 관리자 사원번호별로 담당하고 있는 사원수를 집계 한 후에 관리자별로 담당하고 있는 최대 사원수에 해당하는 관리자 사원번호와 관리하고 있는 사원수를 출력한다.

     

    Python Programming
    emp1 = emp.groupby('mgr')['empno'].count().reset_index()
    emp1.loc[emp1['empno'] == emp['mgr'].groupby(emp['mgr']).count().max(),]

     

    Results
      mgr empno
    1 7698.0 5

     


    3. R Programming (R Package)

    emp 테이블에서 관리자 사원번호별로 담당하고 있는 사원수를 집계 한 후 관리자별로 담당하고 있는 사원수가 최대로 많은 관리자 사원번호와 관리하고 있는 사원수를 출력한다.

     

    R Programming
    %%R
    
    subset( aggregate(empno ~ mgr, data = emp, FUN = function(x) c(count_sal = length(x) ) ), 
            empno == (max(aggregate(empno ~ mgr, data = emp, FUN = function(x) c(count_sal = length(x) ) )['empno']) )   )

     

    Results
       mgr empno
    2 7698     5

     


    4. R Dplyr Package

    emp 테이블에서 관리자 사원번호(‘mgr’)별로 담당하고 있는 사원수를 집계 한 후 관리하고 있는 사원수가 최대로 많은 관리자의 사원번호와 담당하고 있는 사원수를 출력한다.

     

    R Programming
    %%R
    
    emp %>% 
      dplyr::group_by(mgr) %>%
      dplyr::summarize( mgr_cnt = n() ) %>%
      dplyr::filter( mgr_cnt == max(mgr_cnt) )

     

    Results
    `summarise()` ungrouping output (override with `.groups` argument)
    # A tibble: 1 x 2
        mgr mgr_cnt
      <dbl>   <int>
    1  7698       5

     


    5. R sqldf Package

    서브쿼리에서 관리자별로 담당하고 있는 최대 사원수를 집계하여서 해당 관리자의 사원번호와 관리하고 있는 사원수를 출력한다.

     

    R Programming
    %%R
    
    sqldf(" Select mgr,count(*) emp_cnt                                                                       \
            from emp                                                                                          \
            group by mgr                                                                                      \
            having count(*) = (select max(mgr_count) from (select count(mgr) mgr_count from emp group by mgr))")

     

    Results
       mgr emp_cnt
    1 7698       5

     


    인라인뷰(Inline view)에서 관리자 별로 담당하고 있는 사원수(‘mgr_count’)를 집계하고, 집계된 사원수를 내림차순으로 정렬하여서 최대 사원수에 해당하는 row_number() 1번을 선택하여 출력한다.

     

    R Programming
    %%R
    
    sqldf("select *
           from   ( select *, ROW_NUMBER() OVER(ORDER BY mgr_count desc) AS row_rank 
                    from   (select mgr, count(mgr) mgr_count from emp group by mgr) )
           where  row_rank = 1")

     

    Results
       mgr mgr_count row_rank
    1 7698         5        1

     


    6. Python pandasql Package

    서브쿼리에서 관리자별로 담당하고 있는 최대 사원수를 집계하여서 해당 관리자의 사원번호를 출력한다.

     

    Python Programming
    ps.sqldf(" Select mgr ,count(*) emp_cnt                                                                     \
               from emp                                                                                         \
               group by mgr                                                                                     \
               having count(*)=(select max(mgr_count) from (select count(mgr) mgr_count from emp group by mgr)) ")

     

    Results
      mgr emp_cnt
    0 7698.0 5

     


    Python Programming
    ps.sqldf(" select *    \
           from   ( select *, ROW_NUMBER() OVER(ORDER BY mgr_count desc) AS row_rank     \
                    from   (select mgr, count(mgr) mgr_count from emp group by mgr) )    \
           where  row_rank = 1 ")

     

    Results
      mgr mgr_count row_rank
    0 7698.0 5 1

     


    7. R data.table Package

    emp 테이블에서 관리자 사원번호(‘mgr’)별로 담당하고 있는 사원수를 집계 한 후 관리하고 있는 사원수가 최대로 많은 관리자의 사원번호와 담당하고 있는 사원수를 출력한다.

     

    R Programming
    %%R
    
    DT <- data.table(emp)
    
    DT[, if (.N == max(.N)) .SD[, .('emp_cnt' = .N)], keyby = .(mgr)][ (emp_cnt == max(emp_cnt))]

     

    Results
        mgr emp_cnt
    1: 7698       5

     


    emp 테이블에서 관리자 사원번호(‘mgr’)별로 담당하고 있는 사원수를 집계 한 후 관리하고 있는 사원수가 최대로 많은 관리자의 사원번호와 담당하고 있는 사원수를 출력한다.

     

    R Programming
    %%R
    
    DT <- data.table(emp)
    
    DT[, .SD[, .('emp_cnt' = .N)], keyby = .(mgr)][ (emp_cnt == max(emp_cnt))]

     

    Results
        mgr emp_cnt
    1: 7698       5

     


    emp 테이블에서 관리자 사원번호(‘mgr’)별로 담당하고 있는 사원수를 집계하고, 별로로 관리자가 관리하고 있는 사원수의 최대값을 산출 후 이 값과 앞에서 산출한 값을 비교하여서 관리하고 있는 사원수가 최대로 많은 관리자의 사원번호와 담당하고 있는 사원수를 출력한다.

     

    R Programming
    %%R
    
    DT <- data.table(emp)
    
    DT[, .SD[, .('emp_cnt' = .N)], keyby = .(mgr)][emp_cnt== (max(DT[, .SD[, .('emp_cnt' = .N)], keyby = .(mgr)][,'emp_cnt'])),]

     

    Results
    [1] 5

     


    8. SAS Proc SQL

    • ERROR: Summary functions nested in this way are not supported;
    SAS Programming
    %%SAS sas
    
    PROC SQL;
      create table STATSAS_1 as
        SELECT *
        FROM   ( select mgr, count(*) as max_cnt from emp group by mgr )
        HAVING max_cnt = MAX(max_cnt);
    QUIT;
    PROC PRINT;RUN;

     

    Results
    OBS mgr max_cnt
    1 7698 5

     


    서브쿼리에서 관리자별로 담당하고 있는 최대 사원수를 집계하여서 해당 관리자의 사원번호를 출력한다.

     

    SAS Programming
    %%SAS sas
    
    PROC SQL;
      create table STATSAS_1 as
        Select mgr,count(*) as emp_cnt
        from emp
        group by mgr
        having count(*) = (select max(mgr_count) from (select count(mgr) as mgr_count from emp group by mgr));
    QUIT;
    PROC PRINT;RUN;

     

    Results
    OBS mgr emp_cnt
    1 7698 5

     


    SAS Programming
    %%SAS sas
    
    proc sql;
      create table STATSAS_4(where=(monotonic()=1)) as
        select a.*
        from   ( select mgr, count(*) as emp_cnt 
                 from   emp 
                 group 
                    by  mgr
               ) a
        order 
           by  emp_cnt desc;
    quit;
    PROC PRINT;RUN;

     

    Results
    OBS mgr emp_cnt
    1 7698 5

     


    9. SAS Data Step

     

    SAS Programming
    %%SAS sas
    
    proc summary data=emp nway;
         class mgr;
         var   empno;
         output out=emp_1(drop=_:) n=emp_cnt;
    quit;
    
    proc sort data=emp_1 out=emp_2;
         by descending emp_cnt;
    run;
    
    data emp_3;
     set emp_2;
         by descending emp_cnt;
         if _n_ = 1;
    run;
    PROC PRINT;RUN;

     

    Results
    OBS mgr emp_cnt
    1 7698 5

     


    SAS Programming
    %%SAS sas
    
    proc summary data=emp nway;
         class mgr;
         var   empno;
         output out=emp_1(drop=_:) n=emp_cnt;
    quit;
    
    proc rank data=EMP_1 out= SAL_MAX(where=(SAL_rank=1)) ties=low descending;
          var   emp_cnt;
          ranks SAL_rank;
    run;
    PROC PRINT;RUN;

     

    Results
    OBS mgr emp_cnt SAL_rank
    1 7698 5 1

     


    10. Python Dfply Package

     

    Python Programming
    emp >> \
      group_by('mgr') >> \
      summarize(mgr_cnt=X.mgr.count()) >> \
      filter_by(X.mgr_cnt == X.mgr_cnt.max())

     

    Results
      mgr mgr_cnt
    0 7566.0 2
    1 7698.0 5
    2 7782.0 1
    3 7788.0 1
    4 7839.0 3
    5 7902.0 1

     


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

    반응형

    댓글