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

[중복 제거(Distinct)] 특정 조건을 만족하는 데이터 추출 - 비상관 서브쿼리(In) - 137 (오라클 SQL, R, Python, SAS)

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

포스팅 목차

     

    137. Display those employees who are working as manager?

     

    * 관리자 역할을 수행하고 있는 직원들을 출력하시오.


    • 파이썬 & R 패키지 호출 및 예제 데이터 생성 링크
    • 유사문제 : 23번 / 86번 / 111번 / 120번(Merge 방식 포함) / 128번(Unique구문 추가)
    • [데이터 추출] 특정 조건을 만족하는 데이터 추출 - 비상관 서브쿼리(In), 중복 제거(Distinct)
    • 데이터 전처리 - SQL, Pandas, R Prog, Dplyr, Dfply, SQLDF, PANDASQL, DATA.TABLE, SAS, Proc Sql
    • Oracle : 비상관 서버쿼리, In 연산자, Distinct 중복제거
    • 파이썬 Pandas : isin()
    • R 프로그래밍 : %in%, unlist()
    • R Dplyr Package : %in%, unlist()
    • R sqldf Package : 비상관 서버쿼리, In 연산자, Distinct 중복제거
    • Python pandasql Package : 비상관 서버쿼리, In 연산자, Distinct 중복제거
    • R data.table Package : %in%
    • SAS Proc SQL : 비상관 서버쿼리, In 연산자, Distinct 중복제거
    • SAS Data Step : Proc Sort 의 Nodupkey, Merge 구문, IF 조건문
    • R dtplyr Package : lazy_dt, %in%, unlist()
    • R tidytable Package : tidytable::filter, %in%, unlist()
    • Python Dfply Package : row_slice(). isin(), @pipe & def 사용자 정의 함수(pull_list)
    • 파이썬 Base 프로그래밍 :

     


    1. Oracle(오라클)

    서브쿼리를 통하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 선택한다.

     

    Oracle Programming
    select * 
    from   emp 
    where  empno in (select mgr from emp);

     


    emp테이블에서 관리자 사원번호의 중복을 제거 후 emp 테이블과 다시 self join 형식으로 조인하여서 관리자 사원번호에 존재하는 직원의 이름을 출력한다.

     

    Oracle Programming
    SELECT a.*
    FROM   emp a , ( select distinct mgr from emp ) b 
    WHERE  a.EMPNO = b.MGR

     


    2. Python Pandas(파이썬)

    isin 함수를 사용하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 선택한다.

     

    Python Programming
    emp[ emp['empno'].isin(emp['mgr']) ]

     


    Results
      empno ename job mgr hiredate sal comm deptno
    3 7566 JONES MANAGER 7839.0 1981/04/02 2975 NaN 20
    5 7698 BLAKE MANAGER 7839.0 1981/03/01 2850 NaN 30
    6 7782 CLARK MANAGER 7839.0 1981/01/09 2450 NaN 10
    7 7788 SCOTT ANALYST 7566.0 1982/12/09 3000 NaN 20
    8 7839 KING PRESIDENT NaN 1981/11/17 5000 NaN 10
    12 7902 FORD ANALYST 7566.0 1981/12/03 3000 NaN 20

     


    3. R Programming (R Package)

    %in% 함수를 사용하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 선택한다.

     

    R Programming
    %%R
    emp[ emp$empno %in% unlist(emp$mgr)  ,  ]

     

    Results
    # A tibble: 6 x 8
      empno ename job         mgr hiredate     sal  comm deptno
      <dbl> <chr> <chr>     <dbl> <date>     <dbl> <dbl>  <dbl>
    1  7566 JONES MANAGER    7839 1981-04-02  2975    NA     20
    2  7698 BLAKE MANAGER    7839 1981-03-01  2850    NA     30
    3  7782 CLARK MANAGER    7839 1981-01-09  2450    NA     10
    4  7788 SCOTT ANALYST    7566 1982-12-09  3000    NA     20
    5  7839 KING  PRESIDENT    NA 1981-11-17  5000    NA     10
    6  7902 FORD  ANALYST    7566 1981-12-03  3000    NA     20

     


    4. R Dplyr Package

    %in% 함수를 사용하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 선택 후 filter 함수를 통하여 선택된 사원들의 정보를 출력한다.

     

    R Programming
    %%R
    emp %>% 
      dplyr::filter( empno %in% ( emp %>% dplyr::select(mgr) %>% unlist() ) )

     

    Results
    # A tibble: 6 x 8
      empno ename job         mgr hiredate     sal  comm deptno
      <dbl> <chr> <chr>     <dbl> <date>     <dbl> <dbl>  <dbl>
    1  7566 JONES MANAGER    7839 1981-04-02  2975    NA     20
    2  7698 BLAKE MANAGER    7839 1981-03-01  2850    NA     30
    3  7782 CLARK MANAGER    7839 1981-01-09  2450    NA     10
    4  7788 SCOTT ANALYST    7566 1982-12-09  3000    NA     20
    5  7839 KING  PRESIDENT    NA 1981-11-17  5000    NA     10
    6  7902 FORD  ANALYST    7566 1981-12-03  3000    NA     20

     


    5. R sqldf Package

    서브쿼리를 통하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 선택한다.

     

    R Programming
    %%R
    
    sqldf(" select * 
            from   emp 
            where  empno in(select mgr from emp);")

     

    Results
      empno ename       job  mgr   hiredate  sal comm deptno
    1  7566 JONES   MANAGER 7839 1981-04-02 2975   NA     20
    2  7698 BLAKE   MANAGER 7839 1981-03-01 2850   NA     30
    3  7782 CLARK   MANAGER 7839 1981-01-09 2450   NA     10
    4  7788 SCOTT   ANALYST 7566 1982-12-09 3000   NA     20
    5  7839  KING PRESIDENT   NA 1981-11-17 5000   NA     10
    6  7902  FORD   ANALYST 7566 1981-12-03 3000   NA     20

     


    emp테이블에서 관리자 사원번호의 중복을 제거 후 emp 테이블과 다시 self join 형식으로 조인하여서 관리자 사원번호에 존재하는 직원의 이름을 출력한다.

     

    R Programming
    %%R
    
    sqldf(" SELECT a.*
            FROM   emp a , ( select distinct mgr from emp ) b 
            WHERE  a.EMPNO = b.MGR ")

     

    Results
      empno ename       job  mgr   hiredate  sal comm deptno
    1  7566 JONES   MANAGER 7839 1981-04-02 2975   NA     20
    2  7698 BLAKE   MANAGER 7839 1981-03-01 2850   NA     30
    3  7782 CLARK   MANAGER 7839 1981-01-09 2450   NA     10
    4  7788 SCOTT   ANALYST 7566 1982-12-09 3000   NA     20
    5  7839  KING PRESIDENT   NA 1981-11-17 5000   NA     10
    6  7902  FORD   ANALYST 7566 1981-12-03 3000   NA     20

     


    6. Python pandasql Package

     

    Python Programming
    import copy
    
    ps.sqldf(" select * from emp where empno in(select mgr from emp); ")

     


    Results
      empno ename job mgr hiredate sal comm deptno
    0 7566 JONES MANAGER 7839.0 1981/04/02 2975 None 20
    1 7698 BLAKE MANAGER 7839.0 1981/03/01 2850 None 30
    2 7782 CLARK MANAGER 7839.0 1981/01/09 2450 None 10
    3 7788 SCOTT ANALYST 7566.0 1982/12/09 3000 None 20
    4 7839 KING PRESIDENT NaN 1981/11/17 5000 None 10
    5 7902 FORD ANALYST 7566.0 1981/12/03 3000 None 20

     


    7. R data.table Package

    %in% 함수를 통하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 선택한다.

     

    R Programming
    %%R
    
    DT          <- data.table(emp)
    
    DT[ empno %in% DT[,mgr],]

     

    Results
       empno ename       job  mgr   hiredate  sal comm deptno
    1:  7566 JONES   MANAGER 7839 1981-04-02 2975   NA     20
    2:  7698 BLAKE   MANAGER 7839 1981-03-01 2850   NA     30
    3:  7782 CLARK   MANAGER 7839 1981-01-09 2450   NA     10
    4:  7788 SCOTT   ANALYST 7566 1982-12-09 3000   NA     20
    5:  7839  KING PRESIDENT   NA 1981-11-17 5000   NA     10
    6:  7902  FORD   ANALYST 7566 1981-12-03 3000   NA     20

     


    8. SAS Proc SQL

     

    SAS Programming
    %%SAS sas
    
    PROC SQL;
      create table STATSAS_1 as
        select * 
        from   emp 
        where  empno in (select mgr from emp);; 
    QUIT;
    PROC PRINT;RUN;

     


    Results
    OBS empno ename job mgr hiredate sal comm deptno
    1 7566 JONES MANAGER 7839 1981-04-02 2975 . 20
    2 7698 BLAKE MANAGER 7839 1981-03-01 2850 . 30
    3 7782 CLARK MANAGER 7839 1981-01-09 2450 . 10
    4 7788 SCOTT ANALYST 7566 1982-12-09 3000 . 20
    5 7839 KING PRESIDEN . 1981-11-17 5000 . 10
    6 7902 FORD ANALYST 7566 1981-12-03 3000 . 20

     


    SAS Programming
    %%SAS sas
    
    PROC SQL;
      create table STATSAS_2 as
        SELECT a.*
        FROM   emp a , ( select distinct mgr from emp ) b 
        WHERE  a.EMPNO = b.MGR; 
    QUIT;
    PROC PRINT;RUN;

     


    Results
    OBS empno ename job mgr hiredate sal comm deptno
    1 7566 JONES MANAGER 7839 1981-04-02 2975 . 20
    2 7698 BLAKE MANAGER 7839 1981-03-01 2850 . 30
    3 7782 CLARK MANAGER 7839 1981-01-09 2450 . 10
    4 7788 SCOTT ANALYST 7566 1982-12-09 3000 . 20
    5 7839 KING PRESIDEN . 1981-11-17 5000 . 10
    6 7902 FORD ANALYST 7566 1981-12-03 3000 . 20

     


    9. SAS Data Step

     

    SAS Programming
    %%SAS sas
    
    PROC SORT DATA=EMP OUT=EMP_1(RENAME=EMPNO=JOIN_KEY);
         BY EMPNO;
    RUN;
    
    PROC SORT DATA = EMP OUT=EMP_DUP(RENAME=MGR=JOIN_KEY) NODUPKEY;
         BY MGR;
    RUN;
    
    DATA STATSAS_2; 
     MERGE EMP_1(IN=A) EMP_DUP(IN=B);
          BY JOIN_KEY;
          IF A AND B;
    RUN;
    PROC PRINT;RUN;

     


    Results
    OBS JOIN_KEY ename job mgr hiredate sal comm deptno empno
    1 7566 SCOTT ANALYST 7839 1982-12-09 3000 . 20 7788
    2 7698 ALLEN SALESMAN 7839 1981-02-20 1600 300 30 7499
    3 7782 MILLER CLERK 7839 1982-01-23 1300 . 10 7934
    4 7788 ADAMS CLERK 7566 1983-01-12 1100 . 20 7876
    5 7839 JONES MANAGER . 1981-04-02 2975 . 20 7566
    6 7902 SMITH CLERK 7566 1980-12-17 800 . 20 7369

     


    10. R dtplyr Package(data.table)

    %in% 함수를 사용하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 선택 후 filter 함수를 통하여 선택된 사원들의 정보를 출력한다.

     

    R Programming
    %%R
    # library(dplyr, warn.conflicts = FALSE)
    
    lazy_emp <- lazy_dt(emp)
    
    lazy_emp %>% 
      filter( empno %in% ( lazy_emp %>% select(mgr) %>% unlist()  ) )

     

    Results
    Source: local data table [?? x 8]
    Call:   `_DT11`[empno %in% (lazy_emp %>% select(mgr) %>% unlist())]
    
      empno ename  job        mgr hiredate     sal  comm deptno
      <dbl> <chr>  <chr>    <dbl> <date>     <dbl> <dbl>  <dbl>
    1  7369 SMITH  CLERK     7902 1980-12-17   800    NA     20
    2  7499 ALLEN  SALESMAN  7698 1981-02-20  1600   300     30
    3  7521 WARD   SALESMAN  7698 1981-02-22  1250   500     30
    4  7566 JONES  MANAGER   7839 1981-04-02  2975    NA     20
    5  7654 MARTIN SALESMAN  7698 1981-09-28  1250  1400     30
    6  7698 BLAKE  MANAGER   7839 1981-03-01  2850    NA     30
    
    # Use as.data.table()/as.data.frame()/as_tibble() to access results

     


    11. R tidytable Package(data.table)

    %in% 함수를 사용하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 선택 후 filter 함수를 통하여 선택된 사원들의 정보를 출력한다.

     

    R Programming
    %%R
    
    DT          <- data.table(emp)
    
    DT %>% tidytable::filter.(empno %in% ( DT %>% select.(mgr) %>% unlist() ))

     

    Results
    # tidytable [6 x 8]
      empno ename job         mgr hiredate     sal  comm deptno
      <dbl> <chr> <chr>     <dbl> <date>     <dbl> <dbl>  <dbl>
    1  7566 JONES MANAGER    7839 1981-04-02  2975    NA     20
    2  7698 BLAKE MANAGER    7839 1981-03-01  2850    NA     30
    3  7782 CLARK MANAGER    7839 1981-01-09  2450    NA     10
    4  7788 SCOTT ANALYST    7566 1982-12-09  3000    NA     20
    5  7839 KING  PRESIDENT    NA 1981-11-17  5000    NA     10
    6  7902 FORD  ANALYST    7566 1981-12-03  3000    NA     20

     


    12. Python dfply Package(파이썬)

    isin 함수를 사용하여 emp테이블의 관리자 사원번호(‘mgr’)에 명단이 존재하는 사원번호(‘empno’)를 선택 후 row_slice 함수를 통하여 선택된 사원들의 정보를 출력한다.

     

    Python Programming
    emp >> \
      row_slice( X.empno.isin( (emp >> select(X.mgr))['mgr']  ))

     


    Results
      empno ename job mgr hiredate sal comm deptno
    3 7566 JONES MANAGER 7839.0 1981/04/02 2975 NaN 20
    5 7698 BLAKE MANAGER 7839.0 1981/03/01 2850 NaN 30
    6 7782 CLARK MANAGER 7839.0 1981/01/09 2450 NaN 10
    7 7788 SCOTT ANALYST 7566.0 1982/12/09 3000 NaN 20
    8 7839 KING PRESIDENT NaN 1981/11/17 5000 NaN 10
    12 7902 FORD ANALYST 7566.0 1981/12/03 3000 NaN 20

     


     

    Python Programming
    # [참고] 함수 사용. (52번 예제 참고) : AttributeError: 'DataFrame' object has no attribute 'ix'
    @pipe
    def pull_list(df, column=-1):
        return df.loc[:, column]
    
    emp >> \
      filter_by( X.empno.isin( emp >> select(X.mgr) >> pull_list("mgr")))

     


    Results
      empno ename job mgr hiredate sal comm deptno
    3 7566 JONES MANAGER 7839.0 1981/04/02 2975 NaN 20
    5 7698 BLAKE MANAGER 7839.0 1981/03/01 2850 NaN 30
    6 7782 CLARK MANAGER 7839.0 1981/01/09 2450 NaN 10
    7 7788 SCOTT ANALYST 7566.0 1982/12/09 3000 NaN 20
    8 7839 KING PRESIDENT NaN 1981/11/17 5000 NaN 10
    12 7902 FORD ANALYST 7566.0 1981/12/03 3000 NaN 20

     


     

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

    반응형

    댓글