Sparta/CODEKATA

[250813] 스파르타코딩 본캠프 8일차

junecho 2025. 8. 13. 20:54

💥  CODEKATA                                                                                                           

https://www.notion.so/teamsparta/SQL-23a2dc3ef51480bdb42ad77c293b0705

 

기억에 남는 문제들만 기재

그냥 오전내내 풀었음

 

 

 

 

 

11) 여러 기준으로 정렬하기

=>

name이 중복일 경우, datetime이 최근 날짜가 위로 출력되게끔 해야 했음

파이썬일 경우의 문법밖에 생각나지 않아서 지피티의 도움을 받음

case when을 order by 에도 쓸 수 있다는 것을 알았음 !

그리고 중복값일 경우에는 파이썬의 문법 == 을 생각했는데, count로 이름마다 갯수를 세어서 1개가 넘는 경우는 중복값임을 찾아내는 것이었음

 

🔰 PARTITON BY [컬럼명]                                                                                                                                          

     컬럼 내 순위 및 집계

select animal_id, name, datetime
from animal_ins
order by name, 
        case when count(1) over(partition by name) > 1
        then datetime end desc,
        case when count(1) over(partition by name) = 1
        then datetime end

 

 

 

 

22) 조건에 맞는 회원수 구하기

### 1차 코드
### count가 user_id 당 갯수를 세어서 1 1 1 1 이렇게만 출력이 됨
SELECT user_id, age, joined, count(user_id) as users
from user_info
where joined like '2021%'
group by user_id
having age between 20 and 29

 

### 2차코드 - 정답
### 그래서 처음 count를 빼버리고 서브쿼리로 묶은 후, 서브쿼리 밖에서 count 세는걸로 수정함
select count(a.user_id) as users
from (
    SELECT user_id, age, joined
    from user_info
    where joined like '2021%'
    group by user_id
    having age between 20 and 29
) a

 

 

 

 

 

 

추가 문제) solveSQL

Q. 당일의 미세먼지 농도보다 바로 다음날의 미세먼지 농도가 더 안좋은 날 찾기

 

=>

얘는 좀 헤맸다.

measured_at 이 오리지널 날짜였는데, 여기다가 + 1day 만 하고 싶어서 date_add 함수를 썼는데 계속 오류가 남.

원인은 measured_at 컬럼 데이터 타입이 date 가 아니라서 그랬던 것 같음.

 

🔰  DATE (첫번째 인자, modifier, ...)                                                                                                                            

      첫번째 인자로 주어진 시간값을 날짜 형식(YYYY-MM-DD)로 변환

      modifier를 적용한 뒤 날짜를 반환

      day, month, year 더하기/빼기 가능

      ex) date(testdate, '+1 month', '+10 day')  => 한달 + 10 일 더한 날짜 반환

select m1.measured_at as today, m2.measured_at as next_day, 
       m1.pm10, m2.pm10 as next_pm10
from measurements m1 
     join measurements m2 on m1.station = m2.station
     and date(m1.measured_at, '+1 day') = m2.measured_at
where m2.pm10 > m1.pm10