sql - 查找唯一的天数
问题描述
我希望编写一个 SQL 查询来从表中查找每个员工的唯一工作日数times
。
*---------------------------------------*
|emp_id task_id start_day end_day |
*---------------------------------------*
| 1 1 'monday' 'wednesday' |
| 1 2 'monday' 'tuesday' |
| 1 3 'friday' 'friday' |
| 2 1 'monday' 'friday' |
| 2 1 'tuesday' 'wednesday' |
*---------------------------------------*
预期输出:
*-------------------*
|emp_id no_of_days |
*-------------------*
| 1 4 |
| 2 5 |
*-------------------*
我已经编写了查询sqlfiddle,它给了我expected
输出但是出于好奇,有没有更好的方法来编写这个查询?我可以使用日历或理货表吗?
with days_num as
(
select
*,
case
when start_day = 'monday' then 1
when start_day = 'tuesday' then 2
when start_day = 'wednesday' then 3
when start_day = 'thursday' then 4
when start_day = 'friday' then 5
end as start_day_num,
case
when end_day = 'monday' then 1
when end_day = 'tuesday' then 2
when end_day = 'wednesday' then 3
when end_day = 'thursday' then 4
when end_day = 'friday' then 5
end as end_day_num
from times
),
day_diff as
(
select
emp_id,
case
when
(end_day_num - start_day_num) = 0
then
1
else
(end_day_num - start_day_num)
end as total_diff
from days_num
)
select emp_id,
sum(total_diff) as uniq_working_days
from day_diff
group by
emp_id
任何建议都会很棒。
解决方案
简化问题(小提琴)中的语句的一种可能方法是使用VALUES
表值构造函数和适当的连接:
SELECT
t.emp_id,
SUM(CASE
WHEN d1.day_no = d2.day_no THEN 1
ELSE d2.day_no - d1.day_no
END) AS no_of_days
FROM times t
JOIN (VALUES ('monday', 1), ('tuesday', 2), ('wednesday', 3), ('thursday', 4), ('friday', 5)) d1 (day, day_no)
ON t.start_day = d1.day
JOIN (VALUES ('monday', 1), ('tuesday', 2), ('wednesday', 3), ('thursday', 4), ('friday', 5)) d2 (day, day_no)
ON t.end_day = d2.day
GROUP BY t.emp_id
但是,如果您想计算不同的日子,则声明是不同的。您需要找到start_day
andend_day
范围之间的所有天数并计算不同的天数:
;WITH daysCTE (day, day_no) AS (
SELECT 'monday', 1 UNION ALL
SELECT 'tuesday', 2 UNION ALL
SELECT 'wednesday', 3 UNION ALL
SELECT 'thursday', 4 UNION ALL
SELECT 'friday', 5
)
SELECT t.emp_id, COUNT(DISTINCT d3.day_no)
FROM times t
JOIN daysCTE d1 ON t.start_day = d1.day
JOIN daysCTE d2 ON t.end_day = d2.day
JOIN daysCTE d3 ON d3.day_no BETWEEN d1.day_no AND d2.day_no
GROUP BY t.emp_id
推荐阅读
- gradle - Gradle:如何为指定的输入文件运行任务?
- aws-glue - AWS Glue 可以使用 Web 服务作为数据源吗
- python - 在数据框中分隔 2 个数组
- python - 安装的 OpenCV 无法在 PyCharms Python 3.8 项目上运行
- postgresql - 如何使用 postgresql 角色连接数据库?
- python - 如何使用 cmd 运行用 Spider 编写的 python 程序
- windows - 如何从命令行在目标字段中执行带有空格的快捷方式?
- javascript - 在 NodeJS 中循环后获取新数组值时遇到问题
- angular - Angular 8 Resolver 不工作:没有 Resolver 的提供者
- javascript - 循环对象数组返回一个数组