[TIL#18 250314] 주말의 나에게 맡긴다!

강민지·2025년 3월 14일

데이터분석_TIL

목록 보기
18/81

Daily plan

🌞오전

- 8시~ SQL 코드카타 4문제 (lv5 끝내기)
- 10시 QCC
- 11시 30분 QCC 해설

🔥 오후

- 데이터전처리&시각화 강의 3주차
- 파이썬 개인과제 8번
- 파이썬 라이브세션 내용 정리 (복습)

🌝 저녁

- 데일리 스크럼 + TIL 제출

SQL 코드카타

Q73 - 입양 시각 구하기(2)

이건 내 지식으로 풀 수 없는 문제였다,, 덕분에 새로운 문법들을 많이 배웠음^^;;

방법1) WITH RECULSIVE 구문

WITH RECURSIVE HOUR_TABLE AS(
    SELECT 0 HOUR
    UNION ALL
    SELECT HOUR+1
    FROM HOUR_TABLE 
    WHERE HOUR<23
)
SELECT  B.HOUR, COUNT(DISTINCT ANIMAL_ID) COUNT
FROM HOUR_TABLE B LEFT JOIN ANIMAL_OUTS A ON B.HOUR = HOUR(A.DATETIME)
GROUP BY B.HOUR
ORDER BY B.HOUR

SQL에도 재귀식을 사용할 수 있는 줄 몰랐다.
WITH구문에서 0부터 23까지 재귀식을 이용하여 +1해주며 새로운 테이블을 만들고,
이 새로운 테이블을 기준으로 ANIMAL_OUTS 테이블과 조인해주었다.

방법2) SET문 변수 설정

SET @HOUR = -1;
SELECT @HOUR := @HOUR+1 AS HOUR,
	(SELECT COUNT(*)
     FROM ANIMAL_OUTS
     WHERE @HOUR = HOUR(DATETIME)) AS COUNT
FROM ANIMAL_OUTS
WHERE @HOUR<23

SQL에서 SET은 변수를 선언하거나 변수에 값을 할당하는 용도로 사용된다고 한다.

  • @를 활용하여 사용자 정의 변수를 할당 및 식별 -> 변수명 앞에 반드시 @를 붙여야 함
  • SET문 변수 선언이 끝나면 세미콜론(;)으로 쿼리를 반드시 종결해야 함
  • SET에서 할당한 변수의 값을 변경할 때에는 :=로 작성 (비교연산자(=)와 구분하기 위함)

변수를 사용하니까 테이블을 새로 만드는 것보다 훨씬 간편한 거 같음!

방법3) 윈도우 함수 ROW_NUMBER()

SELECT HOUR, COUNT(DATETIME) AS COUNT
FROM (SELECT (ROW_NUMBER() OVER() -1) AS HOUR
	  FROM ANIMAL_OUTS
      LIMIT 24) A
     LEFT JOIN ANIMAL_OUTS B ON A.HOUR = HOUR(B.DATETIME)
GROUP BY HOUR
ORDER BY HOUR

두번째 QCC

한문제를 틀렸다...! 속상ㅜㅜ
2번 문제를 틀렸는데 왜 틀렸는지 확인해봐야겠다.

1. 글로벌 확장 기회 발굴

select count(*) country_count
from country
where gnp < gnpold
  and population >= 10000000
  and gnpold<>0
  and gnpold is not null

2. 도시개발구역 인구 분석

select district,
      round(sum(population)/count(name),0) average_population
from city
group by district
having count(name)>=3
order by average_population desc

다시 보니까 어이없음.. 나 왜 avg함수 안쓰고 평균 저딴식으로 계산했지????
시험보는 동안 머리가 어떻게 되었나봄..

select district,
      round(avg(population),0) average_population
from city
group by district
having count(id)>=3
order by average_population desc

이렇게 하면 훨씬 간단한 것을.... 바보다 바보

  • AVG함수는 NULL값을 자동으로 제외하고 계산해주기 때문에 COUNT를 이용해서 계산한 것과 결과가 다를 수 있음!

3. 인기도시 타겟 마케팅

select city_name, country_name, continent, population
from (select ct.name as city_name,
       c.name as country_name,
       c.continent,
       ct.population,
      rank() over(partition by continent order by ct.population desc) as rank_pop
     from city ct left join country c on c.code = ct.countrycode) a
where rank_pop=1
order by population desc

시험보다가 RANK()함수 문법을 어떻게 썼는지 기억이 안나서 애먹었다,,
윈도우 함수 연습 많이 해봐야 할듯ㅜ.ㅜ

row_number() over (partition by c.continent order by ct.population desc) as rank_pop

튜터님 모법답안에서는 위와 같이 row_number함수를 사용하셨다.


일기

4주차 끝난 기념으로 위장에 기름칠하기
벌써 4주차가 끝났다니...!
4주차나 잘 버텨낸 기념으로 오늘 하루는 끝장나게 쉬어준 것 같다...^^;;
계획한 일들을 다 못했지만 이건 주말의 나에게 넘겨주기로.. 허허

오늘 ADsP 가채점 결과가 나왔는데 의외로 합격했다. 말 안됨..
공부 진짜 안하고 가서 기대 전혀 안하고 있었는데 간신히 턱걸이로 합격했다,,
이게 왜 되지??????
아마 그날 찍신이 강림했나보다

사실 바로 다음 시험 원서접수 하려고 날짜 체크하고 있었는데 넘 기분이 좋다..ㅋㅋㅋ
감사합니다,, 앞으로 공부 열심히 할게요ㅜ.ㅜ

0개의 댓글