본문 바로가기

TIL 통합

12/19 - RECURSIVE(재귀함수), SELECT 구문 서브쿼리

sql 카타

73. 입양 시각 구하기(2) -2

1)변수 선언 및 서브쿼리

2)재귀함수

 

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다.

보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.

 

 

with recursive st as             
    (select 0 hour            <-----hour의 초기값 0으로 설정(처음에 비반복문 최소 1개 이상 사용)
    union all                     <--------재귀함숫 사용시 반드시 union 사용!
    select hour +1 from st       <-------hour가 23이 될 때까지 반복
     where hour <23
    )
select st.hour,
       count(animal_id) count
from st left outer join animal_outs on hour(datetime) = st.hour
group by st.hour
order by st.hour

 

WITH RECUSRSIVE 재귀함수

(1) 구조

WITH RECURSIVE 가상테이블 이름 AS
(
	초기 쿼리
    
    	UNION ALL

	반복할 쿼리 *반복 중단할 WHERE 포함
)

핵심 정리

메모리에 가상의 테이블을 저장

반드시 UNION 사용

반드시 비반복문(Non-Recursive)도 시작할 때 한 개 필수

가상 테이블을 참조하는 문장(반복문)이 바깥에 반드시 필요

 

 

 

76. 상품을 구매한 회원 비율 구하기

서브쿼리 : select에 서브쿼리 넣기

USER_INFO 테이블과 ONLINE_SALE 테이블에서 2021년에 가입한 전체 회원들 중 상품을 구매한 회원수와 상품을 구매한 회원의 비율(=2021년에 가입한 회원 중 상품을 구매한 회원수 / 2021년에 가입한 전체 회원 수)을 년, 월 별로 출력하는 SQL문을 작성해주세요. 상품을 구매한 회원의 비율은 소수점 두번째자리에서 반올림하고, 전체 결과는 년을 기준으로 오름차순 정렬해주시고 년이 같다면 월을 기준으로 오름차순 정렬해주세요.

select year(s.sales_date) year,
       month(s.sales_date) month,
       count(distinct(s.user_id)),
       round(count(distinct(s.user_id))/(select count(user_id) from user_info where year(joined)=2021), 1) purchase_ratio
from online_sale s left join user_info i using(user_id)
where year(i.joined) = 2021
group by 1, 2

 크게 어려울 건 없었지만 SELECT 구문에 서브쿼리가 들어갈 수 있다는 걸 알게해준 문제.

 


TMI

-사전캠프 때 강의 메뉴얼 대로 실습하는 거랑, 실제로 실습하는 거랑 천지차이라는 걸 알게해준 첫 미니 프로젝트. 온종일 기가빨렸고, 조원들에게 민폐가 된건 아닌지 불안...내일 열심히 해야지!

-이제 진짜 컨디션 조절이 관건이다.

-쿠팡에서라도 바로 듀얼 모니터 하나 장만해야겠다. 하루종일 기빨일 일이 한둘이 아니었다