어제 문제
--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,…
**추가 설치
- 원격 서버 접속 : putty
- 원격 프로그램 전송 : 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 – : 이전 디렉토리
[연습문제]
- 홈디렉토리로 이동
- 홈 하위에 test 디렉토리 생성
- test로 이동 후 dir1 dir2 dir3 디렉 생성
- dir2 로 이동
- ch2 로 이동(절대경로)
- 이전 디렉토리로 이동
- 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. 삭제되는 것들 이름 출력
[파일 내용 보기]
- cat : 전체 보기
- more : 파일 앞에서부터 한 화면에 나오는 만큼만 보기
- (enter : 1라인씩 이동, space : 1화면씩)
- less : 뒤에서부터 보기
- head : 파일 앞에서부터 [옵션]라인 수만큼 보기. default=10
- tail : 뒤에서부터 보기. default=10