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

[데이터 전처리 비교- 데이터 추출] 비상관 서브쿼리를 만족하는 데이터 추출 - 중복 제거를 통한 유일한 값 추출 - IN 연산자 - 82

by 기서무나구물 2021. 9. 1.

포스팅 목차

     

    82. Display the jobs found in department number 10 and 20 eliminate duplicate jobs

    * 부서번호 10(회계부서)과 20(연구부서)에 공통으로 존재하는 직무에 대하여 중복을 제거 후에 출력하시오.


    • [데이터 추출] 비상관 서브쿼리(Uncorrelated Subqueyr) 를 만족하는 데이터 추출 - 중복 제거를 통한 유일한 값 추출
    • Oracle : 비상관 서브쿼리, distinct, intersect 연산자
    • 파이썬 Pandas : unique(), .drop_duplicates()
    • R 프로그래밍 : unique()
    • R Dplyr : distinct()
    • R sqldf : distinct
    • Python pandasql : distinct
    • R data.table : by=, Group 별 집계
    • SAS Proc SQL : 비상관 서브쿼리, distinct
    • SAS Data Step : Proc sort의 NODUPKEY 옵션
    • Python Dfply : distinct(), Def 사용자 정의 함수
    • 파이썬 Base 프로그래밍 :

     


    1. Oracle(오라클)

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

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

     


    집합연산자 intersect (교집합) 를 사용하여서 회계부서('10') 와 연구부서('20')에 공통으로 존재하는 직무를 선택 후 중복을 제거하여 출력한다.

    Oracle Programming
    select job from emp where deptno=10 
    
    intersect 
    
    select job from emp where deptno=20;

     


    2. Python Pandas(파이썬)

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

    unique()와 drop_duplicates() 함수를 사용하여서 데이터의 중복을 처리한다.

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

     

    Python Programming
    array(['MANAGER', 'CLERK'], dtype=object)

     

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

     

    Results
      job
    6 MANAGER
    13 CLERK

     


    3. R Programming (R Package)

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

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

     

    Results
    # A tibble: 2 x 1
      job    
      <chr>  
    1 MANAGER
    2 CLERK  

     


    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() )) %>%
      dplyr::select(job) %>%
      dplyr::distinct(job) %>%
      pull()

     

    Results
    [1] "MANAGER" "CLERK"  

     


    5. R sqldf Package

    연구부서('20')에 근무하는 직원들의 직무를 선택 후에 회계부서('10')에서 근무하는 직원들의 직무 중에서 앞에서 선택한 직무로 근무하는 직원들의 직무를 선택하여 중복을 제거 후 출력한다.

    R Programming
    %%R
    
    sqldf(" select distinct(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

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

    Python Programming
    ps.sqldf("select distinct(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)])], .(job)][, .N, by=job]

     

    Results
           job N
    1: MANAGER 1
    2:   CLERK 1

     


     

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

     

    Results
           job
    1: MANAGER
    2:   CLERK

     


    8. SAS Proc SQL

    회계부서('10')에서 근무하는 직원의 직무 중에서 연구부서('20') 직원들의 직무에 존재하는 직무를 선택 후 중복을 제거 후 직무 리스트를 출력한다.

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

     

    Results
    OBS job_distinct
    1 CLERK
    2 MANAGER

     


    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);
         /* IF (A AND B) AND LAST.JOB; */
    RUN;
    
    PROC SORT DATA=STATSAS_2 OUT=STATSAS_21;
         BY JOB;
    RUN;
    
    PROC SORT DATA=STATSAS_21 NODUPKEY;
         BY JOB;
    RUN;
    
    PROC PRINT;RUN;

     

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

     


    10. Python Dfply Package

     

    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"))) >> \
      select(X.job)   >> \
      distinct(X.job) >> \
      pull_list("job")

     

    Results
    6     MANAGER
    13      CLERK
    Name: job, dtype: object

     


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

    반응형

    댓글