对顺序 SQL 记录进行分组

2024-03-29

寻找一种将连续时钟记录分组到单行中的方法。

源系统具有身份列、员工 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 并不总是连续的。日期应该按时间顺序排列。如果只存在两拳,我将需要不间断地填充打卡上班和打卡下班日期(或者我可以使用案例语句提取的一致内容)。无中断示例如下:

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)

Demo: SQL小提琴 http://sqlfiddle.com/#!3/7b9443/1/0

这是按白天设置的,因此午夜后打卡是行不通的,并且奇数的打孔次数也会有问题,但对于像您的示例这样的简单世界来说,这是可行的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对顺序 SQL 记录进行分组 的相关文章

随机推荐

  • 在 Rails 中制作用户年龄的饼图

    我的用户模型中有这个函数可以计算用户年龄 def get age now Time now utc to date now year dob year now month gt dob month now month dob month n
  • Ionic:Android 模拟器错误

    我正在尝试使用 Android Studio v3 0 附带的 Android 模拟器来测试我的 Ionic 3 16 0 混合应用程序 myapp gt ionic cordova build android成功创建构建 但当我跑步时 m
  • 画布在鼠标事件上获取点

    我有以下函数来获取鼠标单击位置 坐标 myCanvas on click function e event e event event window event var canvas document getElementById myCa
  • 适用于 Windows 的 Docker 桌面

    我正在尝试在我的 Windows 10 Pro 64 位计算机上运行 Docker 桌面 其构建规范和设置详细信息如下 版本 Windows 10 专业版 64 位 版本 1903 操作系统版本 18362 657 CPU 英特尔 i7 H
  • MySql触发器更新选择插入后的总和

    我有三张桌子 Members Accounts 交易 在将新事务插入事务表后 我想用所有 Transactions TransactionAmount 的总和更新 Accounts AccountBalance 以下代码似乎对我不起作用 有
  • 不幸的是 已停止

    所以我不知道关于双重帖子的规则是什么 任何我在其他问题上没有得到后续支持的人 任何我的问题被陈述的人 这是我的 logcat 05 28 19 45 03 464 I ActivityManager 274 Start proc xela
  • UnicodeEncodeError:“ascii”编解码器无法对位置 47 中的字符 u'\u2019' 进行编码:序数不在范围内(128)

    我正在使用 Python 2 7 和 MySQLdb 1 2 3 我尝试了在 stackoverflow 和其他论坛上找到的所有内容来处理我的脚本抛出的编码错误 我的脚本从源 MySQL 数据库中的所有表中读取数据 并将它们写入 pytho
  • django modelformset_factory 中的 MultiValueDictKeyError

    我正在尝试实现一个编辑表单集 然后 我使用 modelformset factory 实例化表单集中的对象 当请求不是 POST 时 表单集会完美加载 但是 如果请求是 POST 则表单集构造函数会引发 MultiValueDictKeyE
  • 出口交易需要客户名称和地址 - Stripe 错误

    我正在使用 stripe SDK 创建客户并使用 API 向客户收费 但出现错误 致命错误 未捕获 状态 400 请求 req ZyqUtykjUcOqrU 根据印度法规 出口交易需要客户名称和地址 更多信息请参见 https stripe
  • SQL Server 逆透视两列

    我正在尝试旋转表格以获得 3 列 我的示例表如下 CREATE TABLE tbl1 A1 int cA1 int A2 int cA2 int A3 int cA3 int GO INSERT INTO tbl1 VALUES 60 2
  • Wt C++ Web 框架的主机,部署问题

    我想知道 justhost com 是否足以托管 Wt C 网站 应用程序 它确实允许 FTP 和 SSH 访问http richelbilderbeek nl CppWtDeployGlobalHosted htm http richel
  • pyinstaller 是否有像 gcc -static 这样的参数?

    我有一个类似的问题 有没有办法将 Python 程序编译为二进制并将其与 Scratch Dockerfile 一起使用 https stackoverflow com questions 62581924 is there a way t
  • 在给定图上绘制水平线

    如何向现有绘图添加水平线 Use axhline https matplotlib org stable api as gen matplotlib pyplot axhline html 水平轴线 例如 这会在以下位置绘制一条水平线y 0
  • GUI 中的 __init__ 与 tkinter

    我正在学习使用 Tkinter 使用 python 创建简单的 GUI 我目前正在使用 python 文档作为参考 link http docs python org 2 library tkinter html 我想做的第一件事是理解那里
  • Spark:从 RDD[X] 生成所有可能组合的 RDD[(X, X)]

    Spark 中是否可以从 scala 集合中实现 combinations 函数 Iterates over combinations return An Iterator which traverses the possible n el
  • 矩阵/向量乘法顺序

    我在网上阅读了十几篇关于 OpenGL 中旋转 平移和缩放矩阵乘法的正确顺序的文章 然而 现在我开始自己实现它 我真的很困惑 假设在我的代码中我正在计算变换矩阵 并将其作为一个结果矩阵传递给着色器 shader SetUniform u M
  • 我可以使用 vue test utils 通过 ref 选择一个元素吗

    如果我有一张图片 img class pineapple src pineapple jpg 我可以使用 ref expect wrapper find refs pineapple exists toBe true 代替 expect w
  • 使用 iTextSharp 提取路径和形状

    iTextSharp 支持创建形状和路径PdfContentByte类 您可以在那里设置颜色并绘制曲线和基本元素 是否有一种机制可以以其他方式执行 我可以通过致电获取内容PdfReader GetPageContent 但我没有找到一个 解
  • 如何将数据帧行分组到pandas groupby列表中

    给定一个数据框 我想对第一列进行分组 并将第二列作为行中的列表获取 这样数据框如下 a b A 1 A 2 B 5 B 5 B 4 C 6 becomes A 1 2 B 5 5 4 C 6 我该怎么做呢 您可以使用以下方法执行此操作gro
  • 对顺序 SQL 记录进行分组

    寻找一种将连续时钟记录分组到单行中的方法 源系统具有身份列 员工 ID 日期和输入 输出标志 1 输入 2 输出 请注意 ID EmployeeID DATE InOut 1019374 5890 2008 08 19 14 07 14 1