포스팅 목차
82. Display the jobs found in department number 10 and 20 eliminate duplicate jobs
* 부서번호 10(회계부서)과 20(연구부서)에 공통으로 존재하는 직무에 대하여 중복을 제거 후에 출력하시오.
- [데이터 추출] 비상관 서브쿼리(Uncorrelated Subqueyr) 를 만족하는 데이터 추출 - 중복 제거를 통한 유일한 값 추출
|
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)
- string Vs Base 함수 : https://stringr.tidyverse.org/articles/from-base.html
전체 직원들의 직무 중에서 연구부서('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
'통계프로그램 비교 시리즈 > 프로그래밍비교(Oracle,Python,R,SAS)' 카테고리의 다른 글
[데이터 전처리 비교- 테이블 결합] LEFT JOIN (왼쪽 결합) 으로 2개 테이블 결합 - 오른쪽 테이블에 미존재 데이터 추출 - 84 (0) | 2021.11.15 |
---|---|
[데이터 전처리 비교- 데이터 추출] 비상관 서브쿼리를 만족하는 데이터 추출 - NOT IN 연산자 - 83 (0) | 2021.11.10 |
[데이터 전처리- 데이터 추출] 비상관 서브쿼리(Uncorrelated Subqueyr) 를 만족하는 데이터 추출 - IN 연산자 - 81 (0) | 2021.08.31 |
[데이터 전처리- 날짜함수 예제] 특정 기간 전후 날짜 계산- 날짜 증감 - 80 (0) | 2021.08.31 |
[데이터 전처리- 날짜함수 예제] 현재 시간 출력 - 79 (0) | 2021.08.31 |
댓글