문제 설명
ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다.
NAMETYPENULLABLE| ANIMAL_ID | VARCHAR(N) | FALSE |
| ANIMAL_TYPE | VARCHAR(N) | FALSE |
| DATETIME | DATETIME | FALSE |
| NAME | VARCHAR(N) | TRUE |
| SEX_UPON_OUTCOME | VARCHAR(N) | FALSE |
보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.
예시SQL문을 실행하면 다음과 같이 나와야 합니다.
HOURCOUNT| 0 | 0 |
| 1 | 0 |
| 2 | 0 |
| 3 | 0 |
| 4 | 0 |
| 5 | 0 |
| 6 | 0 |
| 7 | 3 |
| 8 | 1 |
| 9 | 1 |
| 10 | 2 |
| 11 | 13 |
| 12 | 10 |
| 13 | 14 |
| 14 | 9 |
| 15 | 7 |
| 16 | 10 |
| 17 | 12 |
| 18 | 16 |
| 19 | 2 |
| 20 | 0 |
| 21 | 0 |
| 22 | 0 |
| 23 | 0 |
-출처 프로그래머스
답1 with recursive 사용
WITH RECURSIVE TIME AS (
SELECT 0 AS HOUR
UNION ALL
SELECT HOUR+1 FROM TIME WHERE HOUR < 23 )
SELECT A.HOUR
, CASE WHEN B.COUNT IS NULL THEN 0 ELSE B.COUNT END AS COUNT
FROM TIME A
LEFT JOIN (
SELECT DATE_FORMAT(DATETIME, '%H') AS HOUR
, COUNT(DISTINCT ANIMAL_ID) AS COUNT
FROM ANIMAL_OUTS
GROUP BY DATE_FORMAT(DATETIME, '%H') ) B
ON A.HOUR = B.HOUR
ORDER BY A.HOUR ;
답2
select
hour
,ifnull(count,0) as count
from (
select @N := @N + 1 as hour from ANIMAL_OUTS,
(select @N := -1 from dual)nn limit 24
) as a
left join (
select hour(DATETIME) as hr, count(*) as count
from ANIMAL_OUTS
group by hr
) as b
on a.hour = b.hr
답3
SELECT a.hour
,case when b.COUNT is null then 0
else b.COUNT end as COUNT
from (select row_number() over(partition by '1') -1 as hour from ANIMAL_OUTS limit 24) a
left join ( SELECT trim(leading '0' from date_format(datetime,'%H')) as hour, count(1) As COUNT
from ANIMAL_OUTS
where date_format(datetime,'%H') between '00' and '23'
group by trim(leading '0' from date_format(datetime,'%H'))
order by date_format(datetime,'%H')) b
on a.hour = b.hour
'SQL' 카테고리의 다른 글
| SQL 누적합계 구하는 법 (0) | 2022.10.29 |
|---|---|
| SQL 두 종류이상 동시 count()하기 (0) | 2022.10.29 |
| SQL with recursive (0) | 2022.10.27 |
| SQL 우유와 요거트가 담긴 장바구니 (0) | 2022.10.26 |
| SQL Group by 주의점 (0) | 2022.10.26 |