组顺序SQL记录

凯夫拉尔3D

寻找一种将连续的时间记录分组为一行的方法。

源系统具有一个身份列,员工ID,日期和进/出标记(1 =输入和2 =输出)。请注意

ID          EmployeeID    DATE                   InOut
1019374     5890          2008-08-19 14:07:14    1
1019495     5890          2008-08-19 18:17:08    2
1019504     5890          2008-08-19 18:50:40    1
1019601     5890          2008-08-19 22:06:18    2

我正在寻找会给我以下结果的sql

EmployeeID ClockIn             BreakStart          BreakEnd            ClockOut
5890       2008-08-19 14:07:14 2008-08-19 18:17:08 2008-08-19 18:50:40 2008-08-19 22:06:18

请注意,由于对时钟的编辑,源系统中的ID并不总是连续的。日期应按时间顺序。如果仅存在两次打孔,则需要不间断地填充时钟输入和时钟输出日期(或者可以使用case语句提取的一致的东西)。下面没有间断示例:

EmployeeID ClockIn             BreakStart          BreakEnd            ClockOut
5890       2008-08-19 14:07:14                                         2008-08-19 22:06:18

SQL版本是2008 R2

在此先感谢您,我不知道如何使它始终如一地工作,非常感谢您的帮助。

哈特公司

您可以使用ROW_NUMBER()函数和带窗口的窗口COUNT()执行此操作,以处理不休息日:

;with cte as (SELECT *,ROW_NUMBER() OVER(PARTITION BY EmployeeID, CAST(dt AS DATE) ORDER BY dt) RN
                      ,COUNT(*) OVER(PARTITION BY EmployeeID, CAST(dt AS DATE)) Dt_CT
              FROM Table1)
SELECT EmployeeID
      ,Dt = CAST(dt AS DATE)
      ,ClockIn = MAX(CASE WHEN RN = 1 THEN DT END)
      ,BreakStart =  MAX(CASE WHEN Dt_CT = 4 AND RN = 2 THEN DT END)
      ,BreakEnd =  MAX(CASE WHEN Dt_CT = 4 AND RN = 3 THEN DT END)
      ,ClockOut = MAX(CASE WHEN (Dt_CT = 2 AND RN = 2) OR RN = 4 THEN DT END)
FROM cte
GROUP BY EmployeeID
        ,CAST(dt AS DATE)

演示:SQL Fiddle

这是按天设置的,因此午夜后的超时将不起作用,并且打孔次数奇数也有问题,但是对于像您的示例这样的简单世界来说,这样做就可以了。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

组顺序SQL记录

来自分类Dev

SQL组导致“顺序”

来自分类Dev

组大小相等的SQL顺序

来自分类Dev

SQL按顺序删除记录

来自分类Dev

在给定的时间间隔内按时间顺序记录组

来自分类Dev

按顺序对记录进行分组(SQL)

来自分类Dev

通过组SQL获取以前的记录

来自分类Dev

通过SQL获取每个组的最新记录

来自分类Dev

Oracle SQL:如何从组中查找记录

来自分类Dev

Oracle SQL-组和明细记录

来自分类Dev

T-SQL组/组合记录

来自分类Dev

SQL按组查找最新记录

来自分类Dev

SQL 显示缺少记录的组

来自分类Dev

SQL DELETE记录组(基于相反的组为空)

来自分类Dev

基于连续匹配记录的SQL记录中的标签组

来自分类Dev

如何根据SQL查询结果的顺序枚举连续的行组

来自分类Dev

SQL获取一些组并保持顺序

来自分类Dev

DATE DESC +组在其他列上的SQL顺序

来自分类Dev

SQL Server:使用列保存记录的顺序

来自分类Dev

如何使用SQL查询基于顺序关系选择记录

来自分类Dev

在 SQL Server 的 IN 拆分函数中找到的记录的精确排序顺序

来自分类Dev

如何检查 SQL 记录是否按特定顺序排列

来自分类Dev

按字母顺序排列的MYSQL排序组中的最后一条记录

来自分类Dev

cakephp查找具有id顺序的member_id组中的所有记录

来自分类Dev

sql-确定第一组记录

来自分类Dev

SQL从一组数据中获取最新记录

来自分类Dev

如何使用SQL从组中忽略相同的连续记录

来自分类Dev

SQL-选择仅满足某些条件的记录组

来自分类Dev

SQL分组依据对数据组的记录进行计数