inblog logo
|
silver
    SQL문제풀기

    [SQL문제풀기] 서울숲 요일별 대기오염도 계산하기

    silver's avatar
    silver
    Mar 13, 2025
    [SQL문제풀기] 서울숲 요일별 대기오염도 계산하기
    Contents
    문제SQLite

    문제

    solvesql.com
    solvesql.com
    https://solvesql.com/problems/weekday-stats-airpollution/

    SQLite

    내가 작성한 정답

    select weekday, round(avg(no2),4) no2, round(avg(o3),4) o3, round(avg(co),4) co, round(avg(so2),4) so2, round(avg(pm10),4) pm10,round(avg(pm2_5),4) pm2_5 from (select case strftime('%w',measured_at) when '0' then '일요일' when '1' then '월요일' when '2' then '화요일' when '3' then '수요일' when '4' then '목요일' when '5' then '금요일' when '6' then '토요일' end "weekday", no2, o3, co, so2,pm10,pm2_5 from measurements) group by weekday order by case weekday when '월요일' then 1 when '화요일' then 2 when '수요일' then 3 when '목요일' then 4 when '금요일' then 5 when '토요일' then 6 when '일요일' then 7 end
    💡

    date에서 요일 구하기

    SQLite // %w: 0 (일요일)부터 6 (토요일)까지의 숫자로 요일을 반환 // %A: 요일의 이름을 반환 SELECT strftime('%w', '2025-03-13') -- 숫자로 요일 반환 SELECT strftime('%A', '2025-03-13') -- 요일 이름 반환 Oracle // 요일 숫자 (1=일요일, 2=월요일, ..., 7=토요일) SELECT TO_CHAR(TO_DATE('2025-03-13', 'YYYY-MM-DD'), 'D') -- 숫자로 요일 반환 SELECT TO_CHAR(TO_DATE('2025-03-13', 'YYYY-MM-DD'), 'DAY') -- 요일 이름 반환 MySQL // 요일 숫자 (1=일요일, 2=월요일, ..., 7=토요일) - oracle과 동일 SELECT DAYOFWEEK('2025-03-13') -- 숫자로 요일 반환 SELECT DATE_FORMAT('2025-03-13', '%W') -- 요일 이름 반환
     

    Oracle

    SELECT TO_CHAR(measured_at, 'DAY', 'NLS_DATE_LANGUAGE=KOREAN') AS weekday, ROUND(AVG(no2), 4) AS no2, ROUND(AVG(o3), 4) AS o3, ROUND(AVG(co), 4) AS co, ROUND(AVG(so2), 4) AS so2, ROUND(AVG(pm10), 4) AS pm10, ROUND(AVG(pm2_5), 4) AS pm2_5 FROM measurements WHERE station = '서울숲' GROUP BY TO_CHAR(measured_at, 'D'), TO_CHAR(measured_at, 'DAY', 'NLS_DATE_LANGUAGE=KOREAN') // 월요일부터 정렬하려면, 오라클의 NLS 설정에 따라 다를 수 있음 // -> 강제적으로 월요일부터 정렬하려면 DECODE() 또는 CASE 사용 ORDER BY TO_CHAR(measured_at, 'D');

    MYSQL

    SELECT CASE DAYOFWEEK(measured_at) WHEN 2 THEN '월요일' WHEN 3 THEN '화요일' WHEN 4 THEN '수요일' WHEN 5 THEN '목요일' WHEN 6 THEN '금요일' WHEN 7 THEN '토요일' WHEN 1 THEN '일요일' END AS weekday, ROUND(AVG(no2), 4) AS no2, ROUND(AVG(o3), 4) AS o3, ROUND(AVG(co), 4) AS co, ROUND(AVG(so2), 4) AS so2, ROUND(AVG(pm10), 4) AS pm10, ROUND(AVG(pm2_5), 4) AS pm2_5 FROM measurements WHERE station = '서울숲' GROUP BY DAYOFWEEK(measured_at) // FIELD() : 주어진 값이 특정 리스트에서 몇 번째 위치하는지 반환 ORDER BY FIELD(DAYOFWEEK(measured_at), 2, 3, 4, 5, 6, 7, 1);
     
    DBMS
    요일 추출 함수
    정렬 방식
    SQLite
    strftime('%w', measured_at)
    CASE 문 활용
    Oracle
    TO_CHAR(measured_at, 'DAY', 'NLS_DATE_LANGUAGE=KOREAN')
    TO_CHAR(measured_at, 'D') 활용
    MySQL
    DAYOFWEEK(measured_at)
    FIELD() 활용
    Share article

    silver

    RSS·Powered by Inblog