본문 바로가기

R

SQL과 R과 비교(서브쿼리)

728x90
반응형

R 서브쿼리 구현하기

*오라클의 서브쿼리 3가지

1. single row subquery

2. multiple row subquery

3. multiple column subquery

 

 

 

 

 

문제97. JONES 월급보다 많은 월급을 받는 사원들의 이름, 월급을

출력하시오

SQL> select ename, sal

from emp

where sal > (select sal

 from emp

 where ename="JONES");

 

 

x<-emp[ename=="JONES", c("ename","sal")]
> x
  ename  sal
4 JONES 2975
> emp[sal>x$sal, c("ename","sal")]
   ename  sal
8  SCOTT 3000
9   KING 5000
13  FORD 3000
15  JACK 3200

 

 

 

 

 

문제98. 사원테이블에서 가장 많은 월급을 받는 사원의 이름,월급,직업을

출력하시오

x<-emp[sal==max(sal), c("ename","sal","job")]
> x
  ename  sal       job
9  KING 5000 PRESIDENT

 

 

 

 

 

문제99. 전국에서 등록금이 가장 비싼 학교이름과 등록금을 출력하시오

(전국_대학별등록금통계_현황.csv)

 

 global=read.csv("전국_대학별등록금통계_현황.csv", header=T)
> head(global)
  구분 설립유형       학교명 본분교구분 입학금 수업료.A. 기성회비.B. 등록금.A.B.
1 대학     사립   가야대학교       본교    0.0    5606.0           0        5606
2 대학     사립   가야대학교  제2캠퍼스  621.0    6670.5           0        6671
3 대학     사립   가천대학교       본교  878.3    8250.1           0        8250
4 대학     사립 가톨릭대학교       본교  880.0    6901.9           0        6902
5 대학     사립 가톨릭대학교  제2캠퍼스  880.0    8111.3           0        8111
6 대학     사립 가톨릭대학교  제3캠퍼스  880.0    6122.0           0        6122

 

> global[global$등록금.A.B. == max(global$등록금.A.B.), c("학교명", "등록금.A.B.")]
                  학교명 등록금.A.B.
86 명지대학교 자연캠퍼스        9117

 

> global[global$등록금.A.B. == max(global$등록금.A.B.), ]
   구분 설립유형                학교명 본분교구분 입학금 수업료.A. 기성회비.B. 등록금.A.B.
86 대학     사립 명지대학교 자연캠퍼스       본교    880      9117           0        9117

 

 

 

 

문제100. KING 에게 보고하는 사원들의 이름,월급을 출력하시오

KING_EMPNO<-emp[ename=="KING","empno"]
> KING_EMPNO
[1] 7839
> emp[emp$mgr==KING_EMPNO, c("ename","sal")]
   ename  sal
4  JONES 2975
6  BLAKE 2850
7  CLARK 2450
NA  <NA>   NA
> na.omit(emp[emp$mgr==KING_EMPNO, c("ename","sal")])
  ename  sal
4 JONES 2975
6 BLAKE 2850
7 CLARK 2450

 

 

 

 

문제101.

관리자인 사원들의 이름을 출력하시오

 emp[emp$empno %in% emp$mgr, c("ename")]
[1] JONES BLAKE CLARK SCOTT KING  FORD
15 Levels: ADAMS ALLEN BLAKE CLARK FORD JACK JAMES JONES KING MARTIN MILLER SCOTT ... WARD

**보기 안좋다. data.table 씌워서 보기좋게 뽑자 !

 

> data.table( emp[emp$empno %in% emp$mgr, c("ename")] )
      V1
1: JONES
2: BLAKE
3: CLARK
4: SCOTT
5:  KING
6:  FORD

 

 

 

문제102. 관리자가 아닌 사원들의 이름을 출력하시오

data.table( emp[!emp$empno %in% emp$mgr, c("ename")] )
       V1
1:  SMITH
2:  ALLEN
3:   WARD
4: MARTIN
5: TURNER
6:  ADAMS
7:  JAMES
8: MILLER
9:   JACK

 

**느낌표가 not 이다

 

 

 

 

문제103. 작년에 아파트에서 가장 많이 발생한 범죄 유형이 무엇인지

출력하시오(crime_loc.csv 사용)

 

x<-crime_loc[crime_loc$장소=="아파트" , c("범죄","장소","건수")]
> head(x)
    범죄   장소  건수
1   절도 아파트 25389
28  장물 아파트    88
55  손괴 아파트  3122
82  살인 아파트   242
109 강도 아파트   372
136 방화 아파트   354
> data.table( x[x$건수==max(x$건수),] )
   범죄   장소  건수
1: 절도 아파트 25389

 

 

 

 

문제104.(점심시간 문제)

강력범죄가 가장 많이 발생하는 요일은 언제인가?

(crime_day.csv)

 

crime_day=read.csv("crime_day.csv", header=T)
> head(crime_day)
        C_C      C_T  DAY CNT
1 강력범죄  살인기수  SUN  46
2 강력범죄  살인기수  MON  66
3 강력범죄  살인기수  TUE  52
4 강력범죄  살인기수  WED  66
5 강력범죄  살인기수 THUR  41
6 강력범죄  살인기수  FRI  34

 

> x<-crime_day[crime_day$C_C=="강력범죄 " , c("C_C","C_T","DAY", "CNT")]
> head(x)
        C_C      C_T  DAY CNT
1 강력범죄  살인기수  SUN  46
2 강력범죄  살인기수  MON  66
3 강력범죄  살인기수  TUE  52
4 강력범죄  살인기수  WED  66
5 강력범죄  살인기수 THUR  41
6 강력범죄  살인기수  FRI  34

 

> x2<-aggregate(x$CNT~x$DAY,x, sum)
> x2
  x$DAY x$CNT    # <<---- 이것 때문에 names 필요하다
1   FRI  3776
2   MON  3704
3   SAT  4262
4   SUN  3997
5  THUR  3744
6   TUE  3713
7   WED  3766

 

> names(x2)<-c("DAY","CNT")
> x2
   DAY  CNT
1  FRI 3776
2  MON 3704
3  SAT 4262
4  SUN 3997
5 THUR 3744
6  TUE 3713
7  WED 3766

 

> x2[x2$CNT==max(x2$CNT),c("DAY","CNT")]
  DAY  CNT
3 SAT 4262

 

 

 

 

 

순위 출력을 R 구현하는 방법

 

오라클

VS

R

dense_rank

 

rank

 

 

 

 

문제105. 이름, 월급, 월급에 대한 순위를 출력하시오

 

 

min  : 오라클의 rank 같다

   first  : 오라클의 rank 같은데 순위가 같은 데이터가 있으면

인덱스 순서가 먼저 나온 데이터를 높은 순위로 부여한다.

 

:  

인덱스         이름    월급  순위

    2          : FORD   3000   2

    3          : SCOTT  3000   3

 

 data.table(emp$ename, emp$sal,
+            rank(-emp$sal, ties.method="min"))
        V1   V2 V3
 1:  SMITH  800 15
 2:  ALLEN 1600  8
 3:   WARD 1250 11
 4:  JONES 2975  5
 5: MARTIN 1250 11
 6:  BLAKE 2850  6
 7:  CLARK 2450  7
 8:  SCOTT 3000  3
 9:   KING 5000  1
10: TURNER 1500  9
11:  ADAMS 1100 13
12:  JAMES  950 14
13:   FORD 3000  3
14: MILLER 1300 10
15:   JACK 3200  2

 

 

 

문제106. 답을 정렬해서 출력하시오

x<-data.table(emp$ename, emp$sal,
+            rank(-emp$sal, ties.method="
min"))
> names(x)<-c("ename","sal","ran")
> orderBy(~ran, x)
     ename  sal ran
 1:   KING 5000   1
 2:   JACK 3200   2
 3:  SCOTT 3000   3
 4:   FORD 3000   3
 5:  JONES 2975   5
 6:  BLAKE 2850   6
 7:  CLARK 2450   7
 8:  ALLEN 1600   8
 9: TURNER 1500   9
10: MILLER 1300  10
11:   WARD 1250  11
12: MARTIN 1250  11
13:  ADAMS 1100  13
14:  JAMES  950  14
15:  SMITH  800  15

 

 

orderBy(~-x$ran, x)
Error in `[.data.frame`(x, i, j) : undefined columns selected

 

 

ties.method="min" 여기를

ties.method="fisrt" 라고 바꾸면

x<-data.table(emp$ename, emp$sal,
+            rank(-emp$sal, ties.method="first"))
> names(x)<-c("ename","sal","ran")
> orderBy(~ran, x)
     ename  sal ran
 1:   KING 5000   1
 2:   JACK 3200   2
 3:  SCOTT 3000   3
 4:   FORD 3000   4
 5:  JONES 2975   5
 6:  BLAKE 2850   6
 7:  CLARK 2450   7
 8:  ALLEN 1600   8
 9: TURNER 1500   9
10: MILLER 1300  10
11:   WARD 1250  11
12: MARTIN 1250  12
13:  ADAMS 1100  13
14:  JAMES  950  14
15:  SMITH  800  15

 

 

ties.method="min" 동률등수 허용

   ties.method="first" dense_rank 같음

 

 

 

 

 

문제107. 여자들이 많이 걸리는 암의 건수, 순위를 출력하시오

(cancer2.csv 사용)

 

cancer=read.csv("cancer2.csv", header=T)

head(cancer)

unique(cancer2$성별)

[1] 남녀전체 남자     여자 

 

cancer2<-cancer[cancer$성별=="여자" & cancer$암종!="모든암",]

head(cancer2)

x<-data.table(cancer2$암종, cancer2$환자수, 

              rank(-cancer2$환자수, ties.method="min"))

head(x)

names(x) <- c("", "건수", "순위")

x

head(orderBy(~순위, x))

 

    건수 순위
1: 갑상선 217874    1
2: 갑상선 217874    1
3:   유방 131581    3
4:   유방 131581    3
5:   대장  69971    5
6:   대장  69971    5

 

 

 

 

문제108.

2009년도에 서울시에서 교통사고가 일어난 장소,건수,순위를 출력하시오

(car_accident.csv)

 

car=read.csv("car_accident.csv",header=T)

x <- car[ car$year2 == 2009 & car$loc == '서울',]

x

y <- data.table( x$loc , x$loc_desc, x$cnt , rank( -x$cnt , ties.method = 'min'))

names(y) <- c("지역","상세지역","건수","순위")

orderBy(~순위, y)

       지역                                                    상세지역    건수 순위
   1: 서울                                           박내과옆 먹자골목   66    1
   2: 서울                                                        서울   60 
      2
   3: 서울                                                역삼역교차로   56 
   3
   4: 서울                                              교보생명사거리   54    4
   5: 서울                                      남부순환도로 신림4거리   50 5
  ---                                                                          
3541: 서울                                   GS칼텍스 앞 횡단보도 부근    2 2948
3542: 서울                                          지디리얼에스테이트    2 2948
3543: 서울                                 훼미리마트편의점앞 횡단보도    2 2948
3544: 서울                                  강동가톨릭병원 앞 횡단보도    2 2948
3545: 서울 한강시민공원 만남의 광장 자전거대여점 앞 한강시민공원 내 자    2 2948

 

 

 

 

 

 

 

 

 

 

 

 

 

 


728x90
반응형

'R' 카테고리의 다른 글

그래프(원형,막대)  (0) 2019.03.09
SHINY 해체  (0) 2019.03.09
SQL과 R과 비교(조인)  (0) 2019.03.09
SQL과 R과 비교(그룹함수)  (0) 2019.03.09
SQL과 R과 비교(함수)  (0) 2019.03.09