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

[데이터 전처리 비교- 데이터 추출] 비상관 서브쿼리를 만족하는 데이터 추출 - NOT IN 연산자 - 83

by 기서무나구물 2021. 11. 10.

포스팅 목차

    83. Display the jobs which are unique to dept no 10.

     

    * 회계부서('10')에 단독으로 존재하는 직무를 출력하시오.


    • [데이터 추출] 비상관 서브 쿼리(Uncorrelated Subqueyr)를 만족하는 데이터 추출 - NOT IN 연산자
    • Oracle : 비상관 서브쿼리, NOT IN 연산자
    • 파이썬 Pandas : NOT 연산자 ('~') 와 isin()
    • R 프로그래밍 : NOT 연산자 ('!') 와 %in%, unlist
    • R Dplyr : NOT 연산자 ('!') 와 %in%, Filter()
    • R sqldf : 비상관 서브쿼리, NOT IN 연산자
    • Python pandasql : 비상관 서브쿼리, NOT IN 연산자
    • R data.table : NOT 연산자 ('!') 와 %in%, unlist
    • SAS Proc SQL : 비상관 서브쿼리, NOT IN 연산자
    • SAS Data Step : Merge 구문, IF 조건문, IN =
    • Python Dfply : filter_by(), NOT 연산자 ('~') 와 isin(), def 사용자 정의 함수
    • 파이썬 Base 프로그래밍 : not in 연산자

     


    1. Oracle(오라클)

    회계부서('10')에서 근무하는 직원의 직무 중에서 회계부서 이 외 부서에서 근무하는 직원들의 직무를 제외한 회계부서에만 존재하는 직무를 출력한다.

     

    Oracle Programming
    select job 
    from   emp 
    where  deptno = 10 
      and  job not in (select job from emp where deptno<>10);

     


    Minus 연산자를 사용하여서 회계부서('10')에서 존재하는 직무 중에서 회계부서 이 외 부서에 존재하는 직무를 제외한 회계부서에만 단독으로 존재하는 직무를 출력한다.

     

    Oracle Programming
    select job from emp where deptno=10 
    
    minus 
    
    select job from emp where deptno!=10;

     


    2. Python Pandas(파이썬)

    회계부서('10')에서 근무하는 직원들의 직무 중에서 회계부서 이 외 부서에서 근무하는 직원들의 직무를 제외한 회계부서에만 단독으로 존재하는 직무를 출력한다.

     

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

     

    Results
              job
    8	PRESIDENT

     


    3. R Programming (R Package)

    회계부서('10') 에서 근무하는 직원들의 직무 중에서 회계부서 이 외 부서에서 근무하는 직원들의 직무를 제외한 회계부서에만 단독으로 존재하는 직무를 출력한다.

     

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

     

    Results
    # A tibble: 1 x 1
      job      
      <chr>    
    1 PRESIDENT

     


    4. R Dplyr Package

    회계부서('10') 에서 근무하는 직원들의 직무 중에서 회계부서 이 외 부서에서 근무하는 직원들의 직무를 제외한 회계부서에만 단독으로 존재하는 직무를 출력한다.

     

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

     

    Results
    # A tibble: 1 x 1
      job      
      <chr>    
    1 PRESIDENT

     


    5. R sqldf Package

    회계부서('10') 에서 근무하는 직원의 직무 중에서 회계부서 이 외 부서에서 근무하는 직원들의 직무를 제외한 회계부서에만 존재하는 직무를 출력한다.

     

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

     

    Results
            job
    1 PRESIDENT

     


    6. Python pandasql Package

     

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

     

    Results
    	   job
    0	PRESIDENT

     


    7. R data.table Package

    회계부서('10') 에서 근무하는 직원의 직무 중에서 회계부서 이 외 부서에서 근무하는 직원들의 직무를 제외한 회계부서에만 존재하는 직무를 출력한다.

     

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

     

    Results
             job
    1: PRESIDENT

     


    8. SAS Proc SQL

    회계부서('10')에서 근무하는 직원의 직무 중에서 회계부서 이 외 부서에서 근무하는 직원들의 직무를 제외한 회계부서에만 존재하는 직무를 출력한다.

     

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

     

    Results
    OBS	job
    1	PRESIDEN

     


    9. SAS Data Step

    회계부서('10')에서 근무하는 직원의 직무 중에서 회계부서 이 외 부서에서 근무하는 직원들의 직무를 제외한 회계부서에만 존재하는 직무를 출력한다.

     

    SAS Statements
    %%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=1 AND B=0;
    RUN;
    
    PROC PRINT;RUN;

     

    Results
    OBS    job    deptno    DEPTNO1
    1   PRESIDEN	10         .

     


    10. Python Dfply Package

    회계부서('10')에서 근무하는 직원의 직무 중에서 회계부서 이 외 부서에서 근무하는 직원들의 직무를 제외한 회계부서에만 존재하는 직무를 출력한다.

     

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

     

    Results
    	job
    8	PRESIDENT

     


    11. 파이썬 Base Programming

     

    Python Programming
    # skipinitialspace : 칼럼명의 공백 제거
    csv.register_dialect('csv_dialect',skipinitialspace=True,quoting=csv.QUOTE_ALL)
    with open("C:/WORK/RPY_SQL/emp.csv",'r', encoding='utf-8') as csv_file:
        emp_file = csv.DictReader(csv_file,dialect='csv_dialect')
        emp_list = list(emp_file)    
    
        job_list = [row['job'] for row in emp_list if row['deptno'] != '10']
        print(job_list)
        
        print("----------------------------------------------------------------------------------------------------------") 
        
        filter_result = []
        for item in emp_list:
            # 파이썬 사전(Dictionary)에서 복수의 항목 삭제
            [item.pop(key) for key in ['ename', 'mgr', 'sal', 'comm']]
            
            if item['deptno'] == '10' and item['job'] not in job_list:
                filter_result.append(item)
                
        for x in filter_result:
            print(x)

     

    Results
    ['CLERK', 'SALESMAN', 'SALESMAN', 'MANAGER', 'SALESMAN', 'MANAGER', 'ANALYST', 'SALESMAN', 'CLERK', 'CLERK', 'ANALYST']
    ----------------------------------------------------------------------------------------------------------
    {'empno': '7839', 'job': 'PRESIDENT', 'hiredate': '1981/11/17', 'deptno': '10'}

     


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

    반응형

    댓글