假设我们有一个名为 leave_requests 的表,用于存储请假记录,表结构如下:
leave_requests
----------------
id INT (主键,自增)
name VARCHAR (请假人姓名)
start_date DATE (请假开始日期)
end_date DATE (请假结束日期)
SQL实现
WITH RECURSIVE date_sequence AS (
-- 递归的初始部分:选择最小的开始日期
SELECT MIN(start_date) AS date
FROM leave_requests
UNION ALL
-- 递归部分:每次增加一天,直到最大的结束日期
SELECT date + INTERVAL 1 DAY
FROM date_sequence
WHERE date < (SELECT MAX(end_date) FROM leave_requests)
),
leave_counts AS (
-- 统计每一天的请假人数
SELECT ds.date, COUNT(lr.name) AS leave_count
FROM date_sequence ds
LEFT JOIN leave_requests lr
ON ds.date BETWEEN lr.start_date AND lr.end_date
GROUP BY ds.date
)
-- 查询结果
SELECT date AS "日期", leave_count AS "请假人数"
FROM leave_counts
ORDER BY date;