[solvesql/SQLite] 폐쇄할 따릉이 정류소 찾기 2

주연·4일 전
0

SQL 문제 풀이

목록 보기
29/29

문제: https://solvesql.com/problems/find-unnecessary-station-2/
solvesql advent 15번 문제

필요 정보
1. 2019년 10월 한 달 동안 정류소에서 발생한 대여/반납 건수 <=
2018년 10월 한 달 동안 정류소에서 발생한 대여/반납 건수*0.5
를 만족하는 정류소 출력
2. 2018년 10월 또는 2019년 10월 한 달간 대여/반납 건수가 0건인 정류소 -> 포함x
3. 출력 컬럼
station
station_id
name
local

레코드 수 맞지 않음

출력해야할 레코드의 수는 17개인데 16개가 나옴
다른 사람의 정답보면서 맞춰보고자 함

  1. station_id = 2284
    name = CJ오쇼핑앞
    local = 서초구
    의 값이 없음

  2. rent_at 비교
    2018-10-31 의 값이 없음

-> rent_at BETWEEN '2018-10-01' AND '2018-10-31'으로 작성하였기 때문...
BETWEEN은 이상, 미만의 값이기 때문에 위처럼 설정 시 2018-10-30까지만 나옴

코드

WITH rent_s AS (-- 대여 정류소
  SELECT 
    rent_station_id
    , COUNT(CASE WHEN substr(rent_at, 1, 7) = '2019-10' THEN rent_station_id END) rent_2019
    , COUNT(CASE WHEN substr(rent_at, 1, 7) = '2018-10' THEN rent_station_id END) rent_2018
  FROM rental_history r
  GROUP BY rent_station_id
  ), return_s AS (-- 반납 정류소
  SELECT 
    return_station_id
    , COUNT(CASE WHEN return_at BETWEEN '2019-10-01' AND '2019-11-01' THEN return_station_id END) return_2019
    , COUNT(CASE WHEN return_at BETWEEN '2018-10-01' AND '2018-11-01' THEN return_station_id END) return_2018
  FROM rental_history r
  GROUP BY return_station_id
  )

SELECT 
  station_id
  , name
  , local
  , ROUND((rent_2019 + return_2019)/CAST((rent_2018 + return_2018)AS REAL)*100,2) usage_pct
FROM station
LEFT OUTER JOIN rent_s ON station.station_id = rent_s.rent_station_id
LEFT OUTER JOIN return_s ON station.station_id = return_s.return_station_id
WHERE (rent_2019 + return_2019) <= (rent_2018 + return_2018)*0.5 
  AND ROUND((rent_2019 + return_2019)/CAST((rent_2018 + return_2018)AS REAL)*100,2) != 0
profile
공부 기록

0개의 댓글