自行产生模拟数据表 workday 记录了某企业 2020-01-01 到 2022-07-01(星期天)的工 作日情况,由 2 列组成,第一列 d 用于记录日期,记录方式为 char(10),例如‘2022-06-05’, 记录是齐备的但未必排序。第二列为 w 用于记录是否工作日,是则记为 1,否则记为 0。使 用分析函数求出该周期内最长的工作周(注意可能有多个),输出包括:工作周第一天,该 工作周包含的工作天数。
时间: 2024-02-09 09:09:45 浏览: 29
可以使用如下的 SQL 语句来求解该问题:
```
WITH RECURSIVE t (d, w, week_start, week_len, max_week_len) AS (
SELECT d, w, d, w, w FROM workday WHERE d = '2020-01-01'
UNION ALL
SELECT workday.d, workday.w,
CASE WHEN workday.w = 0 THEN workday.d ELSE t.week_start END,
CASE WHEN workday.w = 0 THEN 0 ELSE t.week_len + 1 END,
CASE WHEN workday.w = 0 THEN GREATEST(t.week_len, t.max_week_len) ELSE t.max_week_len END
FROM workday JOIN t ON workday.d = DATE(t.d, '+1 day')
WHERE workday.d <= '2022-07-01'
)
SELECT week_start, max_week_len
FROM t
WHERE week_len = max_week_len
```
这里使用了递归查询,首先从 `workday` 表中选择起始日期为 '2020-01-01' 的记录作为递归的起点,并初始化 `week_start`、`week_len` 和 `max_week_len` 均为该日期对应的值。然后,递归地向后遍历 `workday` 表中的日期,计算出每个日期所在的工作周的起始日期和包含的工作天数,并不断更新 `week_start`、`week_len` 和 `max_week_len` 的值。最终,从递归查询的结果中选择包含最多工作天数的工作周,输出该工作周的起始日期和工作天数即可。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://img-home.csdnimg.cn/images/20210720083646.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)