题目描述

(通过次数528 | 提交次数628,通过率84.08%)

表: Tasks
+-------------+------+
| Column Name | Type |
+-------------+------+
| task_id     | int  |
| assignee_id | int  |
| submit_date | date |
+-------------+------+
task_id 是此表的主键。
此表中的每一行都包含任务 ID、委托人 ID 和提交日期。

编写一个 SQL 来查询:
在周末 (周六,周日) 提交的任务的数量weekend_cnt,以及
工作日内提交的任务数 working_cnt。
按 任意顺序 返回结果表。

查询结果格式如以下示例所示。
示例 1:
输入: 
Tasks 表:
+---------+-------------+-------------+
| task_id | assignee_id | submit_date |
+---------+-------------+-------------+
| 1       | 1           | 2022-06-13  |
| 2       | 6           | 2022-06-14  |
| 3       | 6           | 2022-06-15  |
| 4       | 3           | 2022-06-18  |
| 5       | 5           | 2022-06-19  |
| 6       | 7           | 2022-06-19  |
+---------+-------------+-------------+
输出: 
+-------------+-------------+
| weekend_cnt | working_cnt |
+-------------+-------------+
| 3           | 3           |
+-------------+-------------+
解释: 
Task 1 是在周一提交的。
Task 2 是在周二提交的。
Task 3 是在周三提交的。
Task 4 是在周六提交的。
Task 5 是在周日提交的。
Task 6 是在周日提交的。
3 个任务是在周末提交的。
3 个任务是在工作日提交的。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/tasks-count-in-the-weekend

//测试数据
Create table If Not Exists Tasks (task_id int, assignee_id int, submit_date date);

insert into Tasks (task_id, assignee_id, submit_date) values ('1', '1', '2022-06-13');
insert into Tasks (task_id, assignee_id, submit_date) values ('2', '6', '2022-06-14');
insert into Tasks (task_id, assignee_id, submit_date) values ('3', '6', '2022-06-15');
insert into Tasks (task_id, assignee_id, submit_date) values ('4', '3', '2022-06-18');
insert into Tasks (task_id, assignee_id, submit_date) values ('5', '5', '2022-06-19');
insert into Tasks (task_id, assignee_id, submit_date) values ('6', '7', '2022-06-19');

解题思路

Tasks表中保存了所有的任务信息。包括任务的提交时间。
题目要求:计算周末、周中提交的任务总数。
那么,首先,我们需要计算出每一天是属于周末(周六~周日)还是周中(周一~周五)。
在MySQL数据库中,可以使用weekday函数来返回某个日期为周几。周一返回0,周二返回1,以此类推。
计算出每天是周几后,再使用CASE WHEN来判断是属于周末还是周中,最后使用GROUP BY + SUM汇总统计即可。

参考SQL

未特别说明的情况下,参考SQL为基于MySQL8.0实现。
select
    sum(case when weekday(submit_date) in (5,6) then 1 else 0 end) weekend_cnt,
    sum(case when weekday(submit_date) not in (5,6) then 1 else 0 end) working_cnt
from Tasks;

picture loss