포스팅 목차
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일 이전에 근무한 사람의 정보를 삭제하라.
- 파이썬 & R 패키지 호출 및 예제 데이터 생성 링크
- Where 조건절을 만족하는 데이터 삭제-비상관서브쿼리
|
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
- UPDATE 구문 분제 : 8. Why am I having problems with update?
- : https://cran.r-project.org/web/packages/sqldf/README.html
근무 부서가 ‘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 예제로 만나는 테이블 데이터 처리 방법 리스트
'통계프로그램 비교 시리즈 > 프로그래밍비교(Oracle,Python,R,SAS)' 카테고리의 다른 글
[데이터 추출] 내부조인(Inner join)을 만족하는 데이터 추출 - 101 (0) | 2022.09.29 |
---|---|
[데이터 추출] 비상관 서브쿼리(Uncorrelated Subqueyr) 를 만족하는 데이터 추출 - In 연산자와 내부조인(Inner Join) - 100 (0) | 2022.09.28 |
[데이터 변환] 조건절을 만족하는 데이터 변경 - 98 (0) | 2022.09.28 |
[데이터 추출] 비등가 조인에 해당하는 데이터 추출 - 97 (1) | 2022.09.28 |
[데이터 추출] 값이 존재하지 않는 NULL 데이터 추출 - 96 (0) | 2022.09.28 |
댓글