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

[데이터 삭제] Where 조건절을 만족하는 데이터 삭제-비상관서브쿼리 - 99

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

포스팅 목차

     

    99. Delete those employees who joined the company before 31-dec-82 while there dept location is ‘NEW YORK’ or ‘CHICAGO’.

     

    * 근무 부서가 ‘NEW YORK’ 또는 ‘CHICAGO’에 위치하고, 1982년 12월 31일 이전에 근무한 사람의 정보를 삭제하라.


    • Oracle : Delete 구문, in 연산자, 비상관 서브쿼리
    • 파이썬 Pandas : isin(), NOT('~') 연산자
    • R 프로그래밍 : %in%, NOT('!') 연산자
    • R Dplyr Package : dplyr::filter(), NOT('!') 연산자
    • R sqldf Package : Delete 구문, in 연산자, 비상관 서브쿼리
    • Python pandasql Package : Not 연산자, in 연산자, 비상관 서브쿼리
    • R data.table Package : NOT('!') 연산자, %in%
    • SAS Proc SQL : Delete 구문(논리적 삭제), in 연산자, 비상관 서브쿼리
    • SAS Data Step : Merge 구문, Delete 구문, IF 조건문, NOT 연산자
    • Python Dfply Package : filter_by(), NOT('~') 연산자, isin()
    • 파이썬 Base 프로그래밍 :

     


    1. Oracle(오라클)

    근무 부서가 ‘NEW YORK’ 또는 ‘CHICAGO’에 위치하고, 1982년 12월 31일 이전에 입사한 직원을 선택하여서 직원 정보를 삭제한다.

     

    Oracle Programming
    create table withmooc as
      select *
      from   emp;
    
    delete from withmooc 
    where  hiredate < '31-dec-1982' 
      and  deptno in (select deptno from dept where loc in('NEW YORK','CHICAGO'));
    
    select *
    from   withmooc

     


    2. Python Pandas(파이썬)

    근무 부서가 ‘NEW YORK’ 또는 ‘CHICAGO’에 위치하고, 1982년 12월 31일 이전에 입사한 직원을 선택한 후에 물결표시(Tilde, ~) 로 NOT 연산을 수행하여서 해당 직원 정보를 출력에서 제외한다.

     

    Python Programming
    import copy
    withmooc =copy.copy(emp)
    
    emp
    emp[~( (emp['hiredate']<'1982/12/31') & (emp['deptno'].isin(dept[dept['loc'].isin(['NEW YORK','CHICAGO'])]['deptno'] ) )) ]

     

    Results
    empno ename job mgr hiredate sal comm deptno
    7369 SMITH CLERK 7902.0 1980/12/17 800 NaN 20
    7566 JONES MANAGER 7839.0 1981/04/02 2975 NaN 20
    7788 SCOTT ANALYST 7566.0 1982/12/09 3000 NaN 20
    7876 ADAMS CLERK 7788.0 1983/01/12 1100 NaN 20
    7902 FORD ANALYST 7566.0 1981/12/03 3000 NaN 20

     

     


    3. R Programming (R Package)

    근무 부서가 ‘NEW YORK’ 또는 ‘CHICAGO’에 위치하고, 1982년 12월 31일 이전에 입사한 직원을 선택한 후에 NOT 연산을 수행하기 위해 느낌표(“!”)를 지정하여서 직원 정보를 출력에서 제외한다.

     

    R Programming
    %%R
    
    emp[! ( (emp$hiredate<'1982-12-31') & (emp$deptno %in% dept[dept$loc %in% c('NEW YORK','CHICAGO'), ]$deptno) ),]

     

    Results
    # A tibble: 5 x 8
      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  7566 JONES MANAGER  7839 1981-04-02  2975    NA     20
    3  7788 SCOTT ANALYST  7566 1982-12-09  3000    NA     20
    4  7876 ADAMS CLERK    7788 1983-01-12  1100    NA     20
    5  7902 FORD  ANALYST  7566 1981-12-03  3000    NA     20

     

     


    4. R Dplyr Package

    근무 부서가 ‘NEW YORK’ 또는 ‘CHICAGO’에 위치하고, 1982년 12월 31일 이전에 입사한 직원을 선택한 후에 filter 함수에 NOT 연산을 수행하기 위해 느낌표(“!”)를 지정하여서 해당 직원을 제외한 직원 정보를 선택한다.

     

    R Programming
    %%R
    
    withmooc <- emp
    
    withmooc %>% 
      dplyr::filter( ! ( (hiredate<'1982-12-31') & (deptno %in% ( dept %>%
                                                                     dplyr::filter(loc %in% c('NEW YORK','CHICAGO')) %>%
                                                                     dplyr::select(deptno) %>% 
                                                                     pull(deptno) 
                                                                  ) 
                                                      ) 
                      ) 
                   )

     

     

    Results
    # A tibble: 5 x 8
      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  7566 JONES MANAGER  7839 1981-04-02  2975    NA     20
    3  7788 SCOTT ANALYST  7566 1982-12-09  3000    NA     20
    4  7876 ADAMS CLERK    7788 1983-01-12  1100    NA     20
    5  7902 FORD  ANALYST  7566 1981-12-03  3000    NA     20

     


    5. R sqldf Package

    근무 부서가 ‘NEW YORK’ 또는 ‘CHICAGO’에 위치하고, 1982년 12월 31일 이전에 입사한 직원을 선택하여서 직원 정보를 삭제한다.

     

    R Programming
    %%R
    
    withmooc <- emp
    
    withmooc <- sqldf(c("delete from withmooc where hiredate<'1982-12-31' and deptno in (select deptno from dept where loc in('NEW YORK','CHICAGO'));",
                         "select * from main.withmooc"))
    withmooc

     

     

    Results
      empno ename     job  mgr   hiredate  sal comm deptno
    1  7369 SMITH   CLERK 7902 1980-12-17  800   NA     20
    2  7566 JONES MANAGER 7839 1981-04-02 2975   NA     20
    3  7788 SCOTT ANALYST 7566 1982-12-09 3000   NA     20
    4  7876 ADAMS   CLERK 7788 1983-01-12 1100   NA     20
    5  7902  FORD ANALYST 7566 1981-12-03 3000   NA     20

     


    6. Python pandasql Package

    • 현재 pandasql에서 update 제대로 작동 안 함.

    근무 부서가 ‘NEW YORK’ 또는 ‘CHICAGO’에 위치하고, 1982년 12월 31일 이전에 입사한 직원을 선택하여서 직원 정보를 삭제한다.

    Python Programming
    import copy
    withmooc =copy.copy(emp)
    
    withmooc_1 = ps.sqldf("select * from withmooc where not( hiredate<'1982/12/31' and deptno in (select deptno from dept where loc in ('NEW YORK','CHICAGO')))")
    withmooc_1

     


    Results
    empno ename job mgr hiredate sal comm deptno
    7369 SMITH CLERK 7902.0 1980/12/17 800 None 20
    7566 JONES MANAGER 7839.0 1981/04/02 2975 None 20
    7788 SCOTT ANALYST 7566.0 1982/12/09 3000 None 20
    7876 ADAMS CLERK 7788.0 1983/01/12 1100 None 20
    7902 FORD ANALYST 7566.0 1981/12/03 3000 None 20

     


    7. R data.table Package

    근무 부서가 ‘NEW YORK’ 또는 ‘CHICAGO’에 위치하고, 1982년 12월 31일 이전에 입사한 직원을 선택한 후에 filter 함수에 NOT 연산을 수행하기 위해 느낌표(“!”)를 지정하여서 해당 직원을 제외한 직원 정보를 선택한다.

     

    R Programming
    %%R
    
    DT <- data.table(emp)
    dept_DT <- data.table(dept)
    
    DT[!(hiredate<'1982-12-31' & deptno %in% ( dept_DT[loc %in% c('NEW YORK','CHICAGO'), .(deptno)]$deptno )),]

     

     

    Results
       empno ename     job  mgr   hiredate  sal comm deptno
    1:  7369 SMITH   CLERK 7902 1980-12-17  800   NA     20
    2:  7566 JONES MANAGER 7839 1981-04-02 2975   NA     20
    3:  7788 SCOTT ANALYST 7566 1982-12-09 3000   NA     20
    4:  7876 ADAMS   CLERK 7788 1983-01-12 1100   NA     20
    5:  7902  FORD ANALYST 7566 1981-12-03 3000   NA     20

     


    8. SAS Proc SQL

    근무 부서가 ‘NEW YORK’ 또는 ‘CHICAGO’에 위치하고, 1982년 12월 31일 이전에 입사한 직원을 선택하여서 직원 정보를 삭제한다.

    SAS Programming
    %%SAS sas
    
    DATA withmooc;
     SET emp;
    RUN;
    
    PROC SQL;
      delete from withmooc 
      where  hiredate< mdy(12,31,1982) 
        and  deptno in (select deptno from dept where loc in('NEW YORK','CHICAGO'));
    QUIT;
    PROC PRINT;RUN;

     

     


    Results
    empno ename job mgr hiredate sal comm deptno
    7369 SMITH CLERK 7902 1980-12-17 800 . 20
    7566 JONES MANAGER 7839 1981-04-02 2975 . 20
    7788 SCOTT ANALYST 7566 1982-12-09 3000 . 20
    7876 ADAMS CLERK 7788 1983-01-12 1100 . 20
    7902 FORD ANALYST 7566 1981-12-03 3000 . 20

     


     

    SAS Programming
    %%SAS sas
    
    
    PROC SQL;
      CREATE TABLE STATSAS_1 AS
        select *
        from   emp
        where  NOT ( hiredate < mdy(12,31,1982) and  
                     deptno in (select deptno from dept where loc in('NEW YORK','CHICAGO')));
    QUIT;
    PROC PRINT;RUN;

     

     


    Results
    empno ename job mgr hiredate sal comm deptno
    7369 SMITH CLERK 7902 1980-12-17 800 . 20
    7566 JONES MANAGER 7839 1981-04-02 2975 . 20
    7788 SCOTT ANALYST 7566 1982-12-09 3000 . 20
    7876 ADAMS CLERK 7788 1983-01-12 1100 . 20
    7902 FORD ANALYST 7566 1981-12-03 3000 . 20

     


    9. SAS Data Step

     

    SAS Programming
    %%SAS sas
    
    PROC SORT DATA=emp OUT=EMP_1;
         BY deptno;
    RUN;
    
    PROC SORT DATA=dept OUT=dept_1(KEEP=deptno LOC) NODUPKEY;
         BY deptno;
    RUN;
    
    DATA STATSAS_2;
     MERGE EMP_1(IN=A) dept_1(IN=B);
         BY deptno;
         IF A=1 AND B=1;
         IF loc in ('NEW YORK','CHICAGO') AND hiredate < mdy(12,31,1982) THEN DELETE;
    RUN;
    
    PROC PRINT;RUN;

     


    Results
    empno ename job mgr hiredate sal comm deptno loc
    7369 SMITH CLERK 7902 1980-12-17 800 . 20 DALLAS
    7566 JONES MANAGER 7839 1981-04-02 2975 . 20 DALLAS
    7788 SCOTT ANALYST 7566 1982-12-09 3000 . 20 DALLAS
    7876 ADAMS CLERK 7788 1983-01-12 1100 . 20 DALLAS
    7902 FORD ANALYST 7566 1981-12-03 3000 . 20 DALLAS

     


     

    SAS Programming
    %%SAS sas
    
    PROC SORT DATA=emp OUT=EMP_1;
         BY deptno;
    RUN;
    
    PROC SORT DATA=dept OUT=dept_1(KEEP=deptno LOC) NODUPKEY;
         BY deptno;
    RUN;
    
    DATA STATSAS_2;
     MERGE EMP_1(IN=A) dept_1(IN=B);
         BY deptno;
         IF A=1 AND B=1;
         IF NOT( loc in ('NEW YORK','CHICAGO') AND hiredate < mdy(12,31,1982) ) THEN OUTPUT;
    RUN;
    
    PROC PRINT;RUN;

     


    Results
    empno ename job mgr hiredate sal comm deptno loc
    7369 SMITH CLERK 7902 1980-12-17 800 . 20 DALLAS
    7566 JONES MANAGER 7839 1981-04-02 2975 . 20 DALLAS
    7788 SCOTT ANALYST 7566 1982-12-09 3000 . 20 DALLAS
    7876 ADAMS CLERK 7788 1983-01-12 1100 . 20 DALLAS
    7902 FORD ANALYST 7566 1981-12-03 3000 . 20 DALLAS

     


    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.hiredate < '1982/12/31' ) & 
                           ( X.deptno.isin( dept >> filter_by( X['loc'].isin(['NEW YORK','CHICAGO'])) >> select(X.deptno) >> pull_list("deptno") ))) )

     


    Results
    empno ename job mgr hiredate sal comm deptno
    7369 SMITH CLERK 7902.0 1980/12/17 800 NaN 20
    7566 JONES MANAGER 7839.0 1981/04/02 2975 NaN 20
    7788 SCOTT ANALYST 7566.0 1982/12/09 3000 NaN 20
    7876 ADAMS CLERK 7788.0 1983/01/12 1100 NaN 20
    7902 FORD ANALYST 7566.0 1981/12/03 3000 NaN 20

     


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

    반응형

    댓글