自行产生模拟数据表 workday 记录了某企业 2020-01-01 到 2022-07-01(星期天)的工 作日情况,由 2 列组成,第一列 d 用于记录日期,记录方式为 char(10),例如‘2022-06-05’, 记录是齐备的但未必排序。第二列为 w 用于记录是否工作日,是则记为 1,否则记为 0。使用分析函数求出该周期内最长的工作周(注意可能有多个),输出包括:工作周第一天,该工作周包含的工作天数。要求 1 条 SQL 语句完成。
时间: 2024-02-09 15:10:24 浏览: 68
可以使用以下 SQL 语句来实现:
```
WITH work_weeks AS (
SELECT
d,
w,
d - ROW_NUMBER() OVER (ORDER BY d) AS week_num
FROM
workday
),
work_weeks_agg AS (
SELECT
week_num,
MIN(d) AS start_date,
SUM(w) AS work_days
FROM
work_weeks
GROUP BY
week_num
HAVING
SUM(w) > 0
)
SELECT
start_date,
work_days
FROM
work_weeks_agg
WHERE
work_days = (
SELECT
MAX(work_days)
FROM
work_weeks_agg
);
```
这条 SQL 语句使用了两个 CTE(公共表达式)。第一个 CTE `work_weeks` 使用了窗口函数 `ROW_NUMBER`,将日期按顺序进行编号,并计算出每个日期所在的周数。第二个 CTE `work_weeks_agg` 对 `work_weeks` 进行分组,按周数计算每个工作周的开始日期和工作日数,并且只保留工作日数大于 0 的记录。
最后的查询语句中,我们从 `work_weeks_agg` 中选取工作日数最多的记录,并输出该工作周的开始日期和工作日数。注意到这里可能会有多个工作周的工作日数相同,因此我们需要使用 `WHERE` 子句来过滤出最长的工作周。
阅读全文