포스팅 목차
141. Display the manager who is having maximum number of employees working under him?
* 관리하고 있는 부서원의 수가 가장 많은 부서를 담당하고 있는 관리자의 정보를 출력하시오.
- 파이썬 & R 패키지 호출 및 예제 데이터 생성 링크
- 서브쿼리 : 48 / 50
- [데이터 추출] 특정 조건을 만족하는 데이터 추출 - 비상관 서브쿼리(max), having count()
- 데이터 전처리 -SQL, Pandas, R Prog, Dplyr, Dfply, SQLDF, PANDASQL, DATA.TABLE, SAS, Proc Sql
|
1. Oracle(오라클)
서브쿼리에서 관리자별로 담당하고 있는 최대 사원수를 집계하여서 해당 관리자의 사원번호를 출력한다.
Oracle Programming |
Select mgr
from emp
group
by mgr
having count(*) = (select max(count(mgr)) from emp group by mgr)
인라인뷰(Inline view)에서 관리자 별로 담당하고 있는 사원수(‘mgr_count’)를 집계하고, 집계된 사원수를 내림차순으로 정렬하여서 최대 사원수에 해당하는 row_number() 1번을 선택하여 출력한다.
Oracle Programming |
select *
from ( select a.*, ROW_NUMBER() OVER(ORDER BY mgr_count desc) AS row_rank
from (select mgr, count(mgr) mgr_count from emp group by mgr) a )
where row_rank = 1
with() 구문에서 관리자 별로 담당하고 있는 사원수(‘mgr_count’)를 집계하고, 집계된 사원수를 내림차순으로 정렬한 후 row_number() 함수를 사용하여서 관측치 번호를 부여후에 메인 쿼리에서 최대 사원수에 해당하는 row_number() 1번을 선택하여 출력한다.
Oracle Programming |
with withmooc as
( select a.*,
ROW_NUMBER() OVER(ORDER BY mgr_count desc) AS row_rank
from (select mgr, count(mgr) mgr_count from emp group by mgr) a )
select *
from withmooc
where row_rank = 1
2. Python Pandas(파이썬)
emp테이블에서 관리자 사원번호별로 담당하고 있는 사원수를 집계 한 후에 관리자별로 담당하고 있는 최대 사원수에 해당하는 관리자 사원번호와 관리하고 있는 사원수를 출력한다.
Python Programming |
emp1 = emp.groupby('mgr')['empno'].count().reset_index()
emp1.loc[emp1['empno'] == emp['mgr'].groupby(emp['mgr']).count().max(),]
Results |
mgr | empno | |
1 | 7698.0 | 5 |
3. R Programming (R Package)
emp 테이블에서 관리자 사원번호별로 담당하고 있는 사원수를 집계 한 후 관리자별로 담당하고 있는 사원수가 최대로 많은 관리자 사원번호와 관리하고 있는 사원수를 출력한다.
R Programming |
%%R
subset( aggregate(empno ~ mgr, data = emp, FUN = function(x) c(count_sal = length(x) ) ),
empno == (max(aggregate(empno ~ mgr, data = emp, FUN = function(x) c(count_sal = length(x) ) )['empno']) ) )
Results |
mgr empno
2 7698 5
4. R Dplyr Package
emp 테이블에서 관리자 사원번호(‘mgr’)별로 담당하고 있는 사원수를 집계 한 후 관리하고 있는 사원수가 최대로 많은 관리자의 사원번호와 담당하고 있는 사원수를 출력한다.
R Programming |
%%R
emp %>%
dplyr::group_by(mgr) %>%
dplyr::summarize( mgr_cnt = n() ) %>%
dplyr::filter( mgr_cnt == max(mgr_cnt) )
Results |
`summarise()` ungrouping output (override with `.groups` argument)
# A tibble: 1 x 2
mgr mgr_cnt
<dbl> <int>
1 7698 5
5. R sqldf Package
서브쿼리에서 관리자별로 담당하고 있는 최대 사원수를 집계하여서 해당 관리자의 사원번호와 관리하고 있는 사원수를 출력한다.
R Programming |
%%R
sqldf(" Select mgr,count(*) emp_cnt \
from emp \
group by mgr \
having count(*) = (select max(mgr_count) from (select count(mgr) mgr_count from emp group by mgr))")
Results |
mgr emp_cnt
1 7698 5
인라인뷰(Inline view)에서 관리자 별로 담당하고 있는 사원수(‘mgr_count’)를 집계하고, 집계된 사원수를 내림차순으로 정렬하여서 최대 사원수에 해당하는 row_number() 1번을 선택하여 출력한다.
R Programming |
%%R
sqldf("select *
from ( select *, ROW_NUMBER() OVER(ORDER BY mgr_count desc) AS row_rank
from (select mgr, count(mgr) mgr_count from emp group by mgr) )
where row_rank = 1")
Results |
mgr mgr_count row_rank
1 7698 5 1
6. Python pandasql Package
서브쿼리에서 관리자별로 담당하고 있는 최대 사원수를 집계하여서 해당 관리자의 사원번호를 출력한다.
Python Programming |
ps.sqldf(" Select mgr ,count(*) emp_cnt \
from emp \
group by mgr \
having count(*)=(select max(mgr_count) from (select count(mgr) mgr_count from emp group by mgr)) ")
Results |
mgr | emp_cnt | |
0 | 7698.0 | 5 |
Python Programming |
ps.sqldf(" select * \
from ( select *, ROW_NUMBER() OVER(ORDER BY mgr_count desc) AS row_rank \
from (select mgr, count(mgr) mgr_count from emp group by mgr) ) \
where row_rank = 1 ")
Results |
mgr | mgr_count | row_rank | |
0 | 7698.0 | 5 | 1 |
7. R data.table Package
emp 테이블에서 관리자 사원번호(‘mgr’)별로 담당하고 있는 사원수를 집계 한 후 관리하고 있는 사원수가 최대로 많은 관리자의 사원번호와 담당하고 있는 사원수를 출력한다.
R Programming |
%%R
DT <- data.table(emp)
DT[, if (.N == max(.N)) .SD[, .('emp_cnt' = .N)], keyby = .(mgr)][ (emp_cnt == max(emp_cnt))]
Results |
mgr emp_cnt
1: 7698 5
emp 테이블에서 관리자 사원번호(‘mgr’)별로 담당하고 있는 사원수를 집계 한 후 관리하고 있는 사원수가 최대로 많은 관리자의 사원번호와 담당하고 있는 사원수를 출력한다.
R Programming |
%%R
DT <- data.table(emp)
DT[, .SD[, .('emp_cnt' = .N)], keyby = .(mgr)][ (emp_cnt == max(emp_cnt))]
Results |
mgr emp_cnt
1: 7698 5
emp 테이블에서 관리자 사원번호(‘mgr’)별로 담당하고 있는 사원수를 집계하고, 별로로 관리자가 관리하고 있는 사원수의 최대값을 산출 후 이 값과 앞에서 산출한 값을 비교하여서 관리하고 있는 사원수가 최대로 많은 관리자의 사원번호와 담당하고 있는 사원수를 출력한다.
R Programming |
%%R
DT <- data.table(emp)
DT[, .SD[, .('emp_cnt' = .N)], keyby = .(mgr)][emp_cnt== (max(DT[, .SD[, .('emp_cnt' = .N)], keyby = .(mgr)][,'emp_cnt'])),]
Results |
[1] 5
8. SAS Proc SQL
- ERROR: Summary functions nested in this way are not supported;
SAS Programming |
%%SAS sas
PROC SQL;
create table STATSAS_1 as
SELECT *
FROM ( select mgr, count(*) as max_cnt from emp group by mgr )
HAVING max_cnt = MAX(max_cnt);
QUIT;
PROC PRINT;RUN;
Results |
OBS | mgr | max_cnt |
1 | 7698 | 5 |
서브쿼리에서 관리자별로 담당하고 있는 최대 사원수를 집계하여서 해당 관리자의 사원번호를 출력한다.
SAS Programming |
%%SAS sas
PROC SQL;
create table STATSAS_1 as
Select mgr,count(*) as emp_cnt
from emp
group by mgr
having count(*) = (select max(mgr_count) from (select count(mgr) as mgr_count from emp group by mgr));
QUIT;
PROC PRINT;RUN;
Results |
OBS | mgr | emp_cnt |
1 | 7698 | 5 |
SAS Programming |
%%SAS sas
proc sql;
create table STATSAS_4(where=(monotonic()=1)) as
select a.*
from ( select mgr, count(*) as emp_cnt
from emp
group
by mgr
) a
order
by emp_cnt desc;
quit;
PROC PRINT;RUN;
Results |
OBS | mgr | emp_cnt |
1 | 7698 | 5 |
9. SAS Data Step
SAS Programming |
%%SAS sas
proc summary data=emp nway;
class mgr;
var empno;
output out=emp_1(drop=_:) n=emp_cnt;
quit;
proc sort data=emp_1 out=emp_2;
by descending emp_cnt;
run;
data emp_3;
set emp_2;
by descending emp_cnt;
if _n_ = 1;
run;
PROC PRINT;RUN;
Results |
OBS | mgr | emp_cnt |
1 | 7698 | 5 |
SAS Programming |
%%SAS sas
proc summary data=emp nway;
class mgr;
var empno;
output out=emp_1(drop=_:) n=emp_cnt;
quit;
proc rank data=EMP_1 out= SAL_MAX(where=(SAL_rank=1)) ties=low descending;
var emp_cnt;
ranks SAL_rank;
run;
PROC PRINT;RUN;
Results |
OBS | mgr | emp_cnt | SAL_rank |
1 | 7698 | 5 | 1 |
10. Python Dfply Package
Python Programming |
emp >> \
group_by('mgr') >> \
summarize(mgr_cnt=X.mgr.count()) >> \
filter_by(X.mgr_cnt == X.mgr_cnt.max())
Results |
mgr | mgr_cnt | |
0 | 7566.0 | 2 |
1 | 7698.0 | 5 |
2 | 7782.0 | 1 |
3 | 7788.0 | 1 |
4 | 7839.0 | 3 |
5 | 7902.0 | 1 |
[SQL, Pandas, R Prog, Dplyr, SQLDF, PANDASQL, DATA.TABLE] SQL EMP 예제로 만나는 테이블 데이터 전처리 방법 리스트
댓글