블로그를 이전 중이라 완료되기 전까지는 벨로그에 작성할 계획입니다.
이후 모든 글은 https://weekwith.me 에 작성 예정이니 다른 글이 궁금하시다면 해당 링크를 통해 방문해주세요.본 글은 [ LeetCode ] 2298. Tasks Count in the Weekend를 풀고 작성한 글입니다.
Table: Drivers
+-------------+------+
| Column Name | Type |
+-------------+------+
| task_id | int |
| assignee_id | int |
| submit_date | date |
+-------------+------+
task_id is the primary key for this table.
Each row in this table contains the ID of a task, the id of the assignee, and the submission date.
Write an SQL query to report:
weekend_cnt
, andworking_cnt
.Return the result table in any order.
The query result format is shown in the following example.
처음에 GROUP BY
구를 사용하여 GROUP BY IF(DAYNAME(submit_date) IN('Saturday', 'Sunday'), 'weekend', 'working days'))
와 같이 표현해서 주말과 평일을 기준으로 묶어서 문제를 해결하려 했다.
하지만 이럴 경우 아래 예시 출력 결과와 같이 하나의 행이 아닌 주말인 경우와 평일인 경우로 나누어져 두 개의 행을 반환한다. 그래서 GROUP BY
구를 사용하지 말아야 한다.
+-------------+-------------+
| weekend_cnt | working_cnt |
+-------------+-------------+
| 0 | 3 |
| 3 | 0 |
+-------------+-------------+
결론적으로 단순히 COUNT
함수에 IF
조건문을 활용해서 문제를 해결할 수 있다. 이때 submit_date
필드의 값이 NULL
인 경우, 다시 말해 정상적인 제출이 되지 않은 경우에 대해서 고민을 해봤는데 테스트 케이스를 돌려본 결과 이번 문제는 이런 경우를 따로 가정하지 않는 것 같았다. task_date
필드 또한 존재해서 작업을 시도한 날짜와 제출이 정상적으로 된 날짜가 각각 존재하는 경우, 혹은 Tasks
, Submits
테이블로 나누는 등 다양한 방식으로 문제를 조금 비틀어 내볼 수도 있을 것 같았다.
접근법에 따라 간단하게 COUNT
함수를 나누어 사용하는데 이때 내부 조건으로 IN
과 NOT IN
으로 구별했다.
이때 COUNT
함수는 NULL
값을 무시하는데 이는 SUM
함수 또한 마찬가지다. 연산을 아예 수행하지 않고 건너 뛴다고 생각하면 된다.
SELECT
COUNT(IF(DAYNAME(submit_date) IN ('Saturday', 'Sunday'), submit_date, NULL)) AS weekend_cnt,
COUNT(IF(DAYNAME(submit_date) NOT IN ('Saturday', 'Sunday'), submit_date, NULL)) AS working_cnt
FROM Tasks;