Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 我可以用每天一行计算多行的累计持续时间吗?_Sql_Sql Server_Tsql_Linq To Sql_Gaps And Islands - Fatal编程技术网

Sql 我可以用每天一行计算多行的累计持续时间吗?

Sql 我可以用每天一行计算多行的累计持续时间吗?,sql,sql-server,tsql,linq-to-sql,gaps-and-islands,Sql,Sql Server,Tsql,Linq To Sql,Gaps And Islands,我正在为人力资源部创建缺勤报告。缺勤数据每天作为一行存储在数据库中(列为EmployeeId、缺勤日期、持续时间)。因此,如果我从2020年2月11日星期二到2020年2月21日星期五(含)不上班,表中会有9行: 2020年2月11日-1天 2020年2月12日-1天 2020年2月13日-1天 2020年2月14日-1天 2020年2月17日-1天 2020年2月18日-1天 2020年2月19日-1天 2020年2月20日-1天 2020年2月21日-1天 (见下面的屏幕截图) 人力资源部

我正在为人力资源部创建缺勤报告。缺勤数据每天作为一行存储在数据库中(列为EmployeeId、缺勤日期、持续时间)。因此,如果我从2020年2月11日星期二到2020年2月21日星期五(含)不上班,表中会有9行:

2020年2月11日-1天

2020年2月12日-1天

2020年2月13日-1天

2020年2月14日-1天

2020年2月17日-1天

2020年2月18日-1天

2020年2月19日-1天

2020年2月20日-1天

2020年2月21日-1天

(见下面的屏幕截图)

人力资源部希望在连续缺勤期间的报告中看到单个条目:


我的问题是-如果不使用游标,如何计算SQL中的is(更复杂的是,因为我必须使用Linq to SQL来完成这项工作,但我可能可以将其替换为存储过程。请注意,连续数据的标准是相邻工作日,不包括周末和银行假日。我希望我已经说清楚了……如果没有,我深表歉意。

这是一种间隙和孤岛的形式。在这种情况下,我们e
lag()
查看两次休假是否重叠,然后是累计总和:

select employee, min(absent_from), max(absent_to)
from (select t.*,
             sum(case when prev_absent_to = dateadd(day, -1, absent_from) then 0 else 1
                 end) over (partition by employee order by absent_to) as grp
      from (select t.*,
                   lag(absent_to) over (partition by employee order by absent_from) as prev_absent_to
            from t
           ) t
     ) t
group by employee, grp;

如果需要处理假日和周末,则需要一个日历表。

“请注意,连续数据的标准是相邻工作日,不包括周末和银行假日。”因此,我假设您有一个日历表?遗憾的是,我没有日历表。缺勤应用程序是专有的,不归组织所有,因此我坚持使用现有的架构。您将需要一个用于公共假日的架构。SQL Server不知道公共假日的时间(并且它们因地理位置而异),所以您需要让它知道;日历表在那里是必要的。遗憾的是,我没有日历表。缺勤应用程序是专有的,不归组织所有,因此我只能使用现有的模式。