Oracle 19일차

어제 문제

--1. 다음의 테이블 생성 및 health.csv 파일 데이터를 로딩한 뒤,
create table health(
회원번호    varchar2(20),
이용날짜    varchar2(20),
시작시간    varchar2(20),
종료시간    varchar2(20));

--중복 데이터 삭제 후 처리)
delete from health h1
 where rowid != (select max(rowid)
                   from health
                  where h1.회원번호 = 회원번호
                    and h1.이용날짜 = 이용날짜
                    and h1.시작시간 = 시작시간);
commit;                    
select * from health;      -- 98건


--1) 각 회원별 헬스장 총 이용시간을 시간단위로 출력하고
--   가장 이용시간이 많은 사용자 번호를 출력
--   (단, 한 번 방문 시 하루를 넘기지 않음을 가정)

-- 문자열 이어붙여서 날짜로 만들어서 시간 계산하기
select h.*,
       to_date(이용날짜||' '||시작시간,'YYYY-MM-DD HH24:MI') as 시작date,
       to_date(이용날짜||' '||종료시간,'YYYY-MM-DD HH24:MI') as 종료date,
       to_date(이용날짜||' '||종료시간,'YYYY-MM-DD HH24:MI')-to_date(이용날짜||' '||시작시간,'YYYY-MM-DD HH24:MI') as 이용시간
from health h;
-- 이용시간의 sum 구하기
select distinct 회원번호, sum(이용시간) over(partition by 회원번호 order by 회원번호) as 회원별이용시간
from (select h.*,
             to_date(이용날짜||' '||시작시간,'YYYY-MM-DD HH24:MI') as 시작date,
             to_date(이용날짜||' '||종료시간,'YYYY-MM-DD HH24:MI') as 종료date,
             to_date(이용날짜||' '||종료시간,'YYYY-MM-DD HH24:MI')-to_date(이용날짜||' '||시작시간,'YYYY-MM-DD HH24:MI') as 이용시간
        from health h);
-- 회원별이용시간의 max 구해서
select max(회원별이용시간)
from (select distinct 회원번호, sum(이용시간) over(partition by 회원번호 order by 회원번호) as 회원별이용시간
        from (select h.*,
                     to_date(이용날짜||' '||시작시간,'YYYY-MM-DD HH24:MI') as 시작date,
                     to_date(이용날짜||' '||종료시간,'YYYY-MM-DD HH24:MI') as 종료date,
                     to_date(이용날짜||' '||종료시간,'YYYY-MM-DD HH24:MI')-to_date(이용날짜||' '||시작시간,'YYYY-MM-DD HH24:MI') as 이용시간
                from health h));
-- 결과
select *
from (select distinct 회원번호, sum(이용시간) over(partition by 회원번호 order by 회원번호) as 회원별이용시간
        from (select h.*,
                     to_date(이용날짜||' '||시작시간,'YYYY-MM-DD HH24:MI') as 시작date,
                     to_date(이용날짜||' '||종료시간,'YYYY-MM-DD HH24:MI') as 종료date,
                     to_date(이용날짜||' '||종료시간,'YYYY-MM-DD HH24:MI')-to_date(이용날짜||' '||시작시간,'YYYY-MM-DD HH24:MI') as 이용시간
                from health h))
where 회원별이용시간 = (select max(회원별이용시간)
                    from (select distinct 회원번호, sum(이용시간) over(partition by 회원번호 order by 회원번호) as 회원별이용시간
                            from (select h.*,
                                         to_date(이용날짜||' '||시작시간,'YYYY-MM-DD HH24:MI') as 시작date,
                                         to_date(이용날짜||' '||종료시간,'YYYY-MM-DD HH24:MI') as 종료date,
                                         to_date(이용날짜||' '||종료시간,'YYYY-MM-DD HH24:MI')-to_date(이용날짜||' '||시작시간,'YYYY-MM-DD HH24:MI') as 이용시간
                                    from health h)));

-- 강사님 방법
select 회원번호
from (select 회원번호,
               sum(24*(to_date(종료시간,'HH24:MI')-to_date(시작시간,'HH24:MI'))) as 총이용시간,
               max(sum(24*(to_date(종료시간,'HH24:MI')-to_date(시작시간,'HH24:MI')))) over() as 최대이용시간
        from health h
        group by 회원번호)
where 총이용시간 = 최대이용시간;
--2) 회원별로 최대 방문주기(바로 직전 방문일자와의 "일" 수 차이)가 가장 큰 회원의 회원번호 출력
-- 방문주기 구하기
select h.회원번호, h.이용날짜,
       lag(이용날짜) over(partition by 회원번호 order by 회원번호,이용날짜) as 직전방문일,
       to_date(h.이용날짜,'YYYY-MM-DD')-to_date(lag(이용날짜) over(partition by 회원번호 order by 회원번호,이용날짜),'YYYY-MM-DD') as 방문주기
from health h;
-- 방문주기 max 값 구하기
select max(방문주기)
from (select h.회원번호, h.이용날짜,
             lag(이용날짜) over(partition by 회원번호 order by 회원번호,이용날짜) as 직전방문일,
             to_date(h.이용날짜,'YYYY-MM-DD')-to_date(lag(이용날짜) over(partition by 회원번호 order by 회원번호,이용날짜),'YYYY-MM-DD') as 방문주기
        from health h);
-- 방문주기 max값이랑 같은 회원번호 출력
select 회원번호
from (select h.회원번호, h.이용날짜,
             lag(이용날짜) over(partition by 회원번호 order by 회원번호,이용날짜) as 직전방문일,
             to_date(h.이용날짜,'YYYY-MM-DD')-to_date(lag(이용날짜) over(partition by 회원번호 order by 회원번호,이용날짜),'YYYY-MM-DD') as 방문주기
        from health h)
where 방문주기 = (select max(방문주기)
                 from (select h.회원번호, h.이용날짜,
                              lag(이용날짜) over(partition by 회원번호 order by 회원번호,이용날짜) as 직전방문일,
                              to_date(h.이용날짜,'YYYY-MM-DD')-to_date(lag(이용날짜) over(partition by 회원번호 order by 회원번호,이용날짜),'YYYY-MM-DD') as 방문주기
                         from health h));
                         
-- 강사님 방법
select 회원번호
from (select i.*,
               max(주기) over() 최대이용주기
        from (select h.회원번호,
                   to_date(이용날짜,'YYYY-MM-DD') as 이용날짜,
                   lag(to_date(이용날짜,'YYYY-MM-DD')) over(partition by 회원번호
                                                         order by to_date(이용날짜,'YYYY-MM-DD')) as 이전이용날짜,
                   to_date(이용날짜,'YYYY-MM-DD')
                   -lag(to_date(이용날짜,'YYYY-MM-DD')) over(partition by 회원번호
                                                          order by to_date(이용날짜,'YYYY-MM-DD')) as 주기
              from health h) i)
where 주기 = 최대이용주기;
--3) 금요일 이용횟수가 가장 많은 고객의 회원번호 출력
-- 무슨 요일에 이용했는지 출력
select h.*,
       to_char(to_date(이용날짜,'YYYY-MM-DD'),'day') as 요일
from health h;
-- 금요일 이용한 횟수 출력
select 회원번호, count(회원번호) as 금요일이용수
from health h
where to_char(to_date(이용날짜,'YYYY-MM-DD'),'day') = '금요일'
group by 회원번호;
-- 최대이용수
select max(금요일이용수)
from (select 회원번호, count(회원번호) as 금요일이용수
        from health h
        where to_char(to_date(이용날짜,'YYYY-MM-DD'),'day') = '금요일'
        group by 회원번호);
-- 결과
select 회원번호
from (select 회원번호, count(회원번호) as 금요일이용수
        from health h
        where to_char(to_date(이용날짜,'YYYY-MM-DD'),'day') = '금요일'
        group by 회원번호)
where 금요일이용수 = (select max(금요일이용수)
                   from (select 회원번호, count(회원번호) as 금요일이용수
                           from health h
                          where to_char(to_date(이용날짜,'YYYY-MM-DD'),'day') = '금요일'
                          group by 회원번호));

-- 강사님 방법
select 회원번호
from (select 회원번호, count(회원번호) as 금요일이용횟수,
               max(count(회원번호)) over() as 최대이용횟수
        from health h
        where to_char(to_date(이용날짜,'yyyy-mm-dd'),'day')='금요일'
        group by 회원번호)
where 금요일이용횟수 = 최대이용횟수;

수업 내용

[리눅스 설치]

** os 종류

  • windows
  • 리눅스(command base, GUI 일부 지원)
    종류 : ubuntu, fedora, 레드햇
  • 유닉스(command base, GUI 지원X)
    종류 : HP-UX, Solaris, AIX

**가상머신
host os가 있는 상태에서 guest os 설치를 도와주는 프로그램

  • vmware, virtual box,…

**추가 설치

  1. 원격 서버 접속 : putty
  2. 원격 프로그램 전송 : winscp

[설치 후 환경설정]

$ sudo apt install net-tools
$ ifconfig : ip주소 확인 – ens33에 inet 부분에서
$ sudo apt-get install telnetd
$ sudo apt-get install ssh

** 환경 설정 파일
(홈디렉터리)/home/itwill/

[cd]

change directory
cd directory_route

** 디렉토리 경로
1) 절대 경로 : / 에서 시작하는 경로
2) 상대 경로 : 현재 디렉토리 위치에서 시작하는 경로
~ : home 을 의미함

** 디렉토리 기호
cd / : 루트디렉토리로 이동
cd ~ : 홈디렉토리로 이동
cd .. : 상위 디렉토리로 이동
cd . : 현재 디렉토리
cd – : 이전 디렉토리

[연습문제]

  1. 홈디렉토리로 이동
  2. 홈 하위에 test 디렉토리 생성
  3. test로 이동 후 dir1 dir2 dir3 디렉 생성
  4. dir2 로 이동
  5. ch2 로 이동(절대경로)
  6. 이전 디렉토리로 이동
  7. ch2 로 이동(상대경로)

[ls]

하위 디렉토리와 파일 목록 보기
ls [-옵션] [디렉토리명]
-a : all. 숨김파일까지 보기
-l : list. 상세보기
-d : 지정한 디렉터리 자체의 정보 출력
-R : 하위 디렉터리 목록까지 출력한다

[mkdir]

디렉토리 생성
mkdir [옵션] 디렉토리1 [디렉토리2] [디렉토리3] …
-p : parent. 만약 만들고싶은 디렉토리의 상위가 없다면 그것까지 만들어줌

[rmdir]

비어있는 디렉토리 삭제
rmdir [옵션] 디렉토리1 [디렉토리2] [디렉토리3] …

[rm]

삭제
rm [옵션] [이름]
-r : recursive. 안에 든 것도 삭제
-f : force. 확인 안 함. 강제 삭제
-i : interactive. 확인하고 삭제
-v : verbose. 삭제되는 것들 이름 출력

[파일 내용 보기]

  1. cat : 전체 보기
  2. more : 파일 앞에서부터 한 화면에 나오는 만큼만 보기
    • (enter : 1라인씩 이동, space : 1화면씩)
  3. less : 뒤에서부터 보기
  4. head : 파일 앞에서부터 [옵션]라인 수만큼 보기. default=10
  5. tail : 뒤에서부터 보기. default=10

Leave a Comment