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

[데이터 전처리- 데이터 추출] 비상관 서브쿼리(Uncorrelated Subqueyr) 를 만족하는 데이터 추출 - IN 연산자 - 81

by 기서무나구물 2021. 8. 31.

포스팅 목차

     

    81. Display the common jobs from department number 10 and 20

     

    * 부서번호 10(회계부서)과 20(연구부서)에 공통으로 존재하는 직무를 출력하시오.


    • Oracle : 비상관 서브쿼리, IN 연산자
    • 파이썬 Pandas : isin()
    • R 프로그래밍 : %in%, unlist
    • R Dplyr Package : %in%, Filter()
    • R sqldf Package : 비상관 서브쿼리, IN 연산자
    • Python pandasql Package : 비상관 서브쿼리, IN 연산자
    • R data.table Package : %in%, unlist
    • SAS Proc SQL : 비상관 서브쿼리, IN 연산자
    • SAS Data Step : Merge 구문, IF 조건문, Last.
    • Python Dfply Package : filter_by(), isin(), def 사용자 정의 함수
    • 파이썬 Base 프로그래밍 :

     


    1. Oracle(오라클)

    연구부서('20')에 근무하는 직원들의 직무를 선택 후에 회계부서('10')에서 근무하는 직원의 직무 중에서 연구부서('20') 직원들의 직무에 존재하는 직무를 선택한다.

    Oracle Programming
    select job 
    from   emp 
    where  deptno=10 
      and  job in (select job from emp where deptno=20);

     


    2. Python Pandas(파이썬)

    전체 직원들의 직무 중에서 연구부서 직원들의 직무에 해당하는 직무로 일하고 있는 직원들을 선택 후 회계부서(10)에 근무하는 직원들을 선택한다.

    Python Programming
    emp[(emp['deptno']==10) & emp['job'].isin(emp[emp['deptno'] == 20]['job']) ]

     

    Results
      empno ename job mgr hiredate sal comm deptno
    6 7782 CLARK MANAGER 7839.0 1981/01/09 2450 NaN 10
    13 7934 MILLER CLERK 7782.0 1982/01/23 1300 NaN 10

     


    3. R Programming (R Package)

    전체 직원들의 직무 중에서 연구부서 직원들의 직무에 해당하는 직무로 일하고 있는 직원들을 선택 후 회계부서(10)에 근무하는 직원들을 선택한다.

    R Programming
    %%R
    
    emp[emp$deptno == 10 & emp$job %in% unlist(emp[emp$deptno == '20', "job" ]),]

     

    Results
    # A tibble: 2 x 8
      empno ename  job       mgr hiredate     sal  comm deptno
      <dbl> <chr>  <chr>   <dbl> <date>     <dbl> <dbl>  <dbl>
    1  7782 CLARK  MANAGER  7839 1981-01-09  2450    NA     10
    2  7934 MILLER CLERK    7782 1982-01-23  1300    NA     10

     


    4. R Dplyr Package

    연구부서('20') 직원들의 직무 선택 후 전체 직원들의 직무 중에서 이에 해당하는 직무를 선택하고, 회계부서(10)에 근무하는 직원중에서 앞에서 선택한 직무로 근무하는 직원들을 선택한다.

    R Programming
    %%R
    
    emp %>%
      dplyr::filter( deptno==10 & job %in% ( emp  %>% dplyr::filter( deptno == 20 ) %>% dplyr::select(job) %>% unlist() )) 

     

    Results
    # A tibble: 2 x 8
      empno ename  job       mgr hiredate     sal  comm deptno
      <dbl> <chr>  <chr>   <dbl> <date>     <dbl> <dbl>  <dbl>
    1  7782 CLARK  MANAGER  7839 1981-01-09  2450    NA     10
    2  7934 MILLER CLERK    7782 1982-01-23  1300    NA     10

     


    5. R sqldf Package

    연구부서('20')에 근무하는 직원들의 직무를 선택 후에 회계부서('10')에서 근무하는 직원의 직무 중에서 연구부서 직원들의 직무에 존재하는 직무를 선택한다.

    R Programming
    %%R
    
    sqldf(" select job 
            from   emp 
            where  deptno=10 
              and  job in (select job from emp where deptno=20);")

     

    Results
          job
    1 MANAGER
    2   CLERK

     


    6. Python pandasql Package

    연구부서('20')에 근무하는 직원들의 직무를 선택 후에 회계부서('10')에서 근무하는 직원의 직무 중에서 연구부서('20') 직원들의 직무에 존재하는 직무를 선택한다.

    Python Programming
    ps.sqldf("select job from emp where deptno=10 and job in (select job from emp where deptno=20); ")

     

    Results
      job
    0 MANAGER
    1 CLERK

     


    7. R data.table Package

    연구부서('20')에 근무하는 직원들의 직무를 선택 후 전체 직원들 중에서 이에 해당하는 직무로 근무하는 직원을 선택하고, 해당 직원 중에서 회계부서('10')에 근무하는 직원들을 최종으로 선택한다.

    R Programming
    %%R
    DT <- data.table(emp)
    dept_DT <- data.table(dept)
    
    DT[(deptno == '10') & DT[,job %in% unlist(DT[deptno == '20', .(job)])]]

     

    Results
       empno  ename     job  mgr   hiredate  sal comm deptno
    1:  7782  CLARK MANAGER 7839 1981-01-09 2450   NA     10
    2:  7934 MILLER   CLERK 7782 1982-01-23 1300   NA     10

     


    8. SAS Proc SQL

    연구부서('20')에 근무하는 직원들의 직무를 선택 후에 회계부서('10')에서 근무하는 직원의 직무 중에서 연구부서('20') 직원들의 직무에 존재하는 직무를 선택한다.

    SAS Programming
    %%SAS sas
    
    PROC SQL;
      CREATE TABLE STATSAS_1 AS
        select job 
        from   emp 
        where  deptno=10 
          and  job in (select job from emp where deptno=20);
    QUIT;
    PROC PRINT;RUN;

     

    Results
    OBS job
    1 MANAGER
    2 CLERK

     


    9. SAS Data Step

     

    SAS Programming
    %%SAS sas
    
    PROC SORT DATA=EMP OUT=EMP_1;
         BY JOB;
    RUN;
    
    DATA STATSAS_2;
     MERGE EMP_1(KEEP=JOB DEPTNO WHERE=(DEPTNO=10) IN=A) 
           EMP_1(RENAME=DEPTNO=DEPTNO1 KEEP=JOB DEPTNO WHERE=(DEPTNO1=20) IN=B);
         BY JOB;
         IF (A AND B) AND LAST.JOB;
    RUN;
    
    PROC PRINT;RUN;

     

    Results
    OBS job deptno DEPTNO1
    1 CLERK 10 20
    2 MANAGER 10 20

     


    10. Python Dfply Package

    • pull_list() 사용자 함수 별도 생성
    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.deptno==10, \
                 X.job.isin(emp >> filter_by(X.deptno == 20) >> select(X.job) >> pull_list("job")) )

     

    Results
      empno ename job mgr hiredate sal comm deptno
    6 7782 CLARK MANAGER 7839.0 1981/01/09 2450 NaN 10
    13 7934 MILLER CLERK 7782.0 1982/01/23 1300 NaN 10

     


    [다양한 데이터 전처리 방법 목록 링크] SQL, Pandas, R Prog, Dplyr, SQLDF, PANDASQL, DATA.TABLE

    반응형

    댓글