포스팅 목차
108. Display those employees whose salary is equal to average of maximum and minimum. ( = 에서 > 으로 변경)
* 최대 급여와 최소급여의 평균보다 더 많은 급여를 수령하는 직원의 정보를 출력하시오.
- 파이썬 & R 패키지 호출 및 예제 데이터 생성 링크
- 최소값(Minimum)과 최대값(Maximum) 계산하기
|
1. Oracle(오라클)
서브쿼리내에서 EMP테이블에서 최대 급여와 최소 급여의 평균을 계산 후 이 값보다 더 많은 급여를 수령하는 직원의 정보를 출력한다.
Oracle Programming |
select *
from emp
where sal > (select (max(sal)+min(sal))/2 from emp);
2. Python Pandas(파이썬)
최대 급여와 최소 급여의 평균보다 더 많은 급여를 수령하는 직원의 정보를 출력한다.
Python Programming |
emp.loc[ emp['sal']> (emp['sal'].max()+emp['sal'].min())/2, ]
Results |
empno | ename | job | mgr | hiredate | sal | comm | deptno | |
3 | 7566 | JONES | MANAGER | 7839.0 | 1981/04/02 | 2975 | NaN | 20 |
7 | 7788 | SCOTT | ANALYST | 7566.0 | 1982/12/09 | 3000 | NaN | 20 |
8 | 7839 | KING | PRESIDENT | NaN | 1981/11/17 | 5000 | NaN | 10 |
12 | 7902 | FORD | ANALYST | 7566.0 | 1981/12/03 | 3000 | NaN | 20 |
query() 함수를 사용하여서 최대 급여와 최소 급여의 평균보다 더 많은 급여를 수령하는 직원의 정보를 선택한다.
Python Programming |
emp.query('sal> (sal.max()+sal.min())/2')
Results |
empno | ename | job | mgr | hiredate | sal | comm | deptno | |
3 | 7566 | JONES | MANAGER | 7839.0 | 1981/04/02 | 2975 | NaN | 20 |
7 | 7788 | SCOTT | ANALYST | 7566.0 | 1982/12/09 | 3000 | NaN | 20 |
8 | 7839 | KING | PRESIDENT | NaN | 1981/11/17 | 5000 | NaN | 10 |
12 | 7902 | FORD | ANALYST | 7566.0 | 1981/12/03 | 3000 | NaN | 20 |
3. R Programming (R Package)
최대 급여와 최소 급여의 평균보다 더 많은 급여를 수령하는 직원의 정보를 출력한다.
R Programming |
%%R
emp[ emp$sal>(max(emp$sal)+min(emp$sal))/2, ]
Results |
# A tibble: 4 x 8
empno ename job mgr hiredate sal comm deptno
<dbl> <chr> <chr> <dbl> <date> <dbl> <dbl> <dbl>
1 7566 JONES MANAGER 7839 1981-04-02 2975 NA 20
2 7788 SCOTT ANALYST 7566 1982-12-09 3000 NA 20
3 7839 KING PRESIDENT NA 1981-11-17 5000 NA 10
4 7902 FORD ANALYST 7566 1981-12-03 3000 NA 20
subset() 함수를 사용하여서 최대 급여와 최소 급여의 평균보다 더 많은 급여를 수령하는 직원의 정보를 선택한다.
R Programming |
%%R
subset(emp,sal>(max(emp$sal)+min(emp$sal))/2)
Results |
# A tibble: 4 x 8
empno ename job mgr hiredate sal comm deptno
<dbl> <chr> <chr> <dbl> <date> <dbl> <dbl> <dbl>
1 7566 JONES MANAGER 7839 1981-04-02 2975 NA 20
2 7788 SCOTT ANALYST 7566 1982-12-09 3000 NA 20
3 7839 KING PRESIDENT NA 1981-11-17 5000 NA 10
4 7902 FORD ANALYST 7566 1981-12-03 3000 NA 20
4. R Dplyr Package
dplyr::mutate() 함수를 사용하여 최대 급여와 최소 급여를 신규 변수로 생성하고, dplyr::filter() 함수를 사용하여서 최대 급여와 최소 급여의 평균보다 더 많은 급여를 수령하는 직원의 정보를 선택한다.
R Programming |
%%R
emp %>%
dplyr::mutate(max_sal = max(sal), min_sal = min(sal)) %>%
dplyr::filter(sal > (max_sal + min_sal)/2)
Results |
# A tibble: 4 x 10
empno ename job mgr hiredate sal comm deptno max_sal min_sal
<dbl> <chr> <chr> <dbl> <date> <dbl> <dbl> <dbl> <dbl> <dbl>
1 7566 JONES MANAGER 7839 1981-04-02 2975 NA 20 5000 800
2 7788 SCOTT ANALYST 7566 1982-12-09 3000 NA 20 5000 800
3 7839 KING PRESIDENT NA 1981-11-17 5000 NA 10 5000 800
4 7902 FORD ANALYST 7566 1981-12-03 3000 NA 20 5000 800
5. R sqldf Package
서브쿼리내에서 EMP테이블에서 최대 급여와 최소 급여의 평균을 계산 후 이 값보다 더 많은 급여를 수령하는 직원의 정보를 출력한다.
R Programming |
%%R
sqldf(" select *
from emp
where sal > (select (max(sal)+min(sal))/2 from emp);")
Results |
empno ename job mgr hiredate sal comm deptno
1 7566 JONES MANAGER 7839 1981-04-02 2975 NA 20
2 7788 SCOTT ANALYST 7566 1982-12-09 3000 NA 20
3 7839 KING PRESIDENT NA 1981-11-17 5000 NA 10
4 7902 FORD ANALYST 7566 1981-12-03 3000 NA 20
6. Python pandasql Package
서브쿼리내에서 EMP테이블에서 최대 급여와 최소 급여의 평균을 계산 후 이 값보다 더 많은 급여를 수령하는 직원의 정보를 출력한다.
Python Programming |
ps.sqldf(" select * \
from emp \
where sal>(select (max(sal)+min(sal))/2 from emp);")
Results |
empno | ename | job | mgr | hiredate | sal | comm | deptno | |
0 | 7566 | JONES | MANAGER | 7839.0 | 1981/04/02 | 2975 | None | 20 |
1 | 7788 | SCOTT | ANALYST | 7566.0 | 1982/12/09 | 3000 | None | 20 |
2 | 7839 | KING | PRESIDENT | NaN | 1981/11/17 | 5000 | None | 10 |
3 | 7902 | FORD | ANALYST | 7566.0 | 1981/12/03 | 3000 | None | 20 |
7. R data.table Package
최대 급여와 최소 급여의 평균보다 더 많은 급여를 수령하는 직원의 정보를 출력한다.
R Programming |
%%R
DT <- data.table(emp)
dept_DT <- data.table(dept)
salgrade_DT <- data.table(salgrade)
DT[sal > ((max(sal)+min(sal))/2),]
Results |
empno ename job mgr hiredate sal comm deptno
1: 7566 JONES MANAGER 7839 1981-04-02 2975 NA 20
2: 7788 SCOTT ANALYST 7566 1982-12-09 3000 NA 20
3: 7839 KING PRESIDENT NA 1981-11-17 5000 NA 10
4: 7902 FORD ANALYST 7566 1981-12-03 3000 NA 20
8. SAS Proc SQL
서브쿼리내에서 EMP테이블에서 최대 급여와 최소 급여의 평균을 계산 후 이 값보다 더 많은 급여를 수령하는 직원의 정보를 출력한다.
SAS Programming |
%%SAS sas
PROC SQL;
CREATE TABLE STATSAS_1 AS
select *
from emp
where sal > (select (max(sal)+min(sal))/2 from emp);;
QUIT;
PROC PRINT;RUN;
Results |
OBS | empno | ename | job | mgr | hiredate | sal | comm | deptno |
1 | 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975 | . | 20 |
2 | 7788 | SCOTT | ANALYST | 7566 | 1982-12-09 | 3000 | . | 20 |
3 | 7839 | KING | PRESIDEN | . | 1981-11-17 | 5000 | . | 10 |
4 | 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000 | . | 20 |
sas 에서는 group by 없이 having 사용 가능 : inline view없이 한 번에 처리 가능;
SAS Programming |
%%SAS sas
PROC SQL;
CREATE TABLE STATSAS_2 AS
select A.*,
(max(sal)+min(sal))/2 AS SAL_AVG
from emp A
having sal > (max(sal)+min(sal))/2;
QUIT;
PROC PRINT;RUN;
Results |
OBS | empno | ename | job | mgr | hiredate | sal | comm | deptno | SAL_AVG |
1 | 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975 | . | 20 | 2900 |
2 | 7788 | SCOTT | ANALYST | 7566 | 1982-12-09 | 3000 | . | 20 | 2900 |
3 | 7839 | KING | PRESIDEN | . | 1981-11-17 | 5000 | . | 10 | 2900 |
4 | 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000 | . | 20 | 2900 |
9. SAS Data Step
SAS Programming |
%%SAS sas
PROC SUMMARY DATA=EMP;
VAR SAL;
OUTPUT OUT=EMP_AVG(DROP=_:) MIN=SAL_MIN MAX=SAL_MAX;
RUN;
DATA STATSAS_3;
SET EMP_AVG;
DO I=1 TO KOBS;
SET EMP NOBS=KOBS POINT=I;
SAL_AVG = (SAL_MAX+SAL_MIN)/2;
IF SAL > (SAL_MAX+SAL_MIN)/2 THEN OUTPUT;
END;
RUN;
PROC PRINT;RUN;
Results |
OBS | SAL_MIN | SAL_MAX | empno | ename | job | mgr | hiredate | sal | comm | deptno | SAL_AVG |
1 | 800 | 5000 | 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975 | . | 20 | 2900 |
2 | 800 | 5000 | 7788 | SCOTT | ANALYST | 7566 | 1982-12-09 | 3000 | . | 20 | 2900 |
3 | 800 | 5000 | 7839 | KING | PRESIDEN | . | 1981-11-17 | 5000 | . | 10 | 2900 |
4 | 800 | 5000 | 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000 | . | 20 | 2900 |
- Macro 변수 할당 방식
SAS Programming |
%%SAS sas
PROC SQL noprint;
select (max(sal)+min(sal))/2 into :SAL_AVG
from emp A;
QUIT;
%put TNote: SAL_AVG = &SAL_AVG;
DATA STATSAS_4;
SET emp;
IF SAL > &SAL_AVG THEN OUTPUT;
RUN;
PROC PRINT;RUN;
Results |
OBS | empno | ename | job | mgr | hiredate | sal | comm | deptno |
1 | 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975 | . | 20 |
2 | 7788 | SCOTT | ANALYST | 7566 | 1982-12-09 | 3000 | . | 20 |
3 | 7839 | KING | PRESIDEN | . | 1981-11-17 | 5000 | . | 10 |
4 | 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000 | . | 20 |
- Data step의 Macro 변수 할당 방식
SAS Programming |
%%SAS sas
PROC SUMMARY DATA=EMP;
VAR SAL;
OUTPUT OUT=EMP_AVG(DROP=_:) MIN=SAL_MIN MAX=SAL_MAX;
RUN;
DATA _NULL_;
SET EMP_AVG;
CALL SYMPUT('SAL_AVG',(SAL_MAX+SAL_MIN)/2);
RUN;
%put TNote: SAL_AVG = &SAL_AVG;
DATA STATSAS_5;
SET emp;
IF SAL >= &SAL_AVG THEN OUTPUT;
RUN;
PROC PRINT;RUN;
Results |
OBS | empno | ename | job | mgr | hiredate | sal | comm | deptno |
1 | 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975 | . | 20 |
2 | 7788 | SCOTT | ANALYST | 7566 | 1982-12-09 | 3000 | . | 20 |
3 | 7839 | KING | PRESIDEN | . | 1981-11-17 | 5000 | . | 10 |
4 | 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000 | . | 20 |
10. Python Dfply Package
Python Programming |
emp >> mutate(max_sal = X.sal.max(), min_sal = X.sal.min()) >> filter_by(X.sal > ( (X.max_sal + X.min_sal) / 2) )
Results |
empno | ename | job | mgr | hiredate | sal | comm | deptno | max_sal | min_sal | |
3 | 7566 | JONES | MANAGER | 7839.0 | 1981/04/02 | 2975 | NaN | 20 | 5000 | 800 |
7 | 7788 | SCOTT | ANALYST | 7566.0 | 1982/12/09 | 3000 | NaN | 20 | 5000 | 800 |
8 | 7839 | KING | PRESIDENT | NaN | 1981/11/17 | 5000 | NaN | 10 | 5000 | 800 |
12 | 7902 | FORD | ANALYST | 7566.0 | 1981/12/03 | 3000 | NaN | 20 | 5000 | 800 |
[SQL, Pandas, R Prog, Dplyr, SQLDF, PANDASQL, DATA.TABLE] SQL EMP 예제로 만나는 테이블 데이터 전처리 방법 리스트
'통계프로그램 비교 시리즈 > 프로그래밍비교(Oracle,Python,R,SAS)' 카테고리의 다른 글
[데이터 추출] 해당 그룹에 대한 특정 조건을 만족하는 그룹 리스트 출력 - 110 (0) | 2022.12.06 |
---|---|
[데이터 추출] 그룹 집계 후 특정 조건을 만족하는 그룹의 집계 통계량 출력 - 109 (0) | 2022.12.05 |
[데이터 추출] 관측치 최대값(MAX) 리스트 추출 - 107 (0) | 2022.12.04 |
[데이터 정렬 - 내림차순 정렬] 수치형 데이터를 기준으로 내림차순 정렬 - 37 (오라클 SQL, R, Python, SAS) (0) | 2022.10.31 |
[데이터 추출] 상위 Top 5 관측치 추출하기 - 106 (0) | 2022.10.03 |
댓글