在SQL Server中获取重叠时间戳的不同行

艾伦

我有以下从SQL Server获得的结果集:

employeeNumber | start_date | start_time | end_date     | end_time
---------------+------------+------------+--------------+----------
123            | 10-03-2020 |  18:13:55  |  10-03-2020  | 22:59:46
123            | 10-03-2020 |  18:24:22  |  10-03-2020  | 22:59:51
123            | 10-03-2020 |  23:24:22  |  10-03-2020  | 23:59:51
123            | 11-03-2020 |  18:25:25  |  11-03-2020  | 20:59:51
123            | 12-03-2020 |  18:40:22  |  12-03-2020  | 22:59:52

在某些情况下,我有多行具有与上述相同的重叠时间(行1和2),但是开始和结束时间不同(以秒或分钟为单位的差异)。

虽然我的查询是一个简单的选择查询,可从源表中获取数据,但我可以在where子句中添加什么以获取此类重叠时间戳行的不同行。即对于上面的查询,我希望结果集返回以下内容:

employeeNumber | start_date | start_time | end_date     | end_time    
---------------+------------+------------+--------------+----------
123            | 10-03-2020 |  18:13:55  |  10-03-2020  | 22:59:46
123            | 10-03-2020 |  23:24:22  |  10-03-2020  | 23:59:51
123            | 11-03-2020 |  18:25:25  |  11-03-2020  | 20:59:51
123            | 12-03-2020 |  18:40:22  |  12-03-2020  | 22:59:52

以下是我的查询:

select 
    employeeNumber, start_date, start_time, end_date, end_time
from 
    emp_data
where 
    employeeNumber = 123
order by 
    employeeNumber;

我可能只能提取第一条记录,但是where子句将是什么。

感谢您提供任何帮助,因为我对SQL Server不太熟悉。

戈登·利诺夫

这是复杂的。您需要跟踪“开始”和“结束”。我将假设您的列是datetime或可以组合成单个列的类似内容:

with e as (
      select e.employeeNumber, v.dt, sum(v.inc) as inc,
             sum(sum(v.inc)) over (partition by e.employeeNumber order by v.dt) as in_outs
      from emp_data e cross apply
           (values (start_date + start_time, 1),
                   (end_date + end_time, -1)
           ) v(dt, inc)
      group by e.employeeNumber, v.dt
     )
select employeeNumber, min(dt) as start_datetime, max(dt) as end_datetime
from (select e.*,
             sum(case when in_outs = 0 then 1 else 0 end) over (partition by employeeNumber order by dt) as grp
      from e
     ) e
where in_outs <> 0
group by employeeNumber, grp;

是db <>小提琴。

这是在做什么

  • 首先将日期/时间转换为日期时间。
  • 然后,这些列将被取消透视并标识为开始和结束,以及+1或-1,以指示当时员工是“进入”还是“现有”。
  • 这些是累积的。
  • 现在您有一个缺口和孤岛的问题,您想在其中找到连续的“英寸”。“岛屿”是使用“ ins”的累积总和来标识的。
  • 然后将这些汇总。

编辑:

您可以将累计金额替换为:

from (select e.*,
             (select sum(case when e2.in_outs = 0 then 1 else 0 end) 
              from e e2
              where e2.employeeNumber = e.employeeNumber
                    e2.dt <= e.dt
             ) as grp
      from e
     ) e

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SQL Server中的时间戳混乱

来自分类Dev

SQL Server中的当前时间戳

来自分类Dev

删除时间戳列不同的SQL Server中单个表中的行

来自分类Dev

SQL Server中Round函数的不同行为

来自分类Dev

如何使用联接在SQL Server中基于时间戳获取最新记录

来自分类Dev

通过Month SQL计算时间戳中的不同日期

来自分类Dev

在特定日期和时间之后获取数据,但日期和时间在SQL Server的不同列中

来自分类Dev

SQL获取每个值的不同行的计数

来自分类Dev

如何在Oracle SQL中获取日期列的时间戳?

来自分类Dev

拆分 SQL 中的重叠时间

来自分类Dev

如何在SQL Server 2008中比较不同行和不同列中的值

来自分类Dev

如何在 SQL Server 中的时间戳和时间戳之间

来自分类Dev

SQL:删除组中的不同行?

来自分类Dev

SQL Server 2005中具有相同ID的不同行中的Concat列

来自分类Dev

从 SQL 中的时间戳中提取时间

来自分类Dev

如何在T-SQL中将一行中的时间范围拆分为不同行中的不同季度

来自分类Dev

SQL获取登录和注销时间戳

来自分类Dev

不同行的SQL总和

来自分类Dev

SQL Server中同一个表的不同行同时读写

来自分类Dev

Oracle时间戳到SQL Server DateTime

来自分类Dev

SQL Server:PIVOT时间戳和计算

来自分类Dev

SQL Server时间戳数据类型

来自分类Dev

如何在 SQL Server 中对按重叠时间分组的持续时间求和

来自分类Dev

SQL Server 中没有重叠时间的总持续时间

来自分类Dev

SQL查询以获取不同事件中的时间间隔

来自分类Dev

获取最新版本更改时间戳 SQL Server

来自分类Dev

基于不同的时间戳/时间戳和用户选择的输入(T-SQL)的SQL分段/平均

来自分类Dev

SQL Server:基于结果集的不同行的列上的将来值

来自分类Dev

Oracle SQL中的时间戳转换

Related 相关文章

  1. 1

    SQL Server中的时间戳混乱

  2. 2

    SQL Server中的当前时间戳

  3. 3

    删除时间戳列不同的SQL Server中单个表中的行

  4. 4

    SQL Server中Round函数的不同行为

  5. 5

    如何使用联接在SQL Server中基于时间戳获取最新记录

  6. 6

    通过Month SQL计算时间戳中的不同日期

  7. 7

    在特定日期和时间之后获取数据,但日期和时间在SQL Server的不同列中

  8. 8

    SQL获取每个值的不同行的计数

  9. 9

    如何在Oracle SQL中获取日期列的时间戳?

  10. 10

    拆分 SQL 中的重叠时间

  11. 11

    如何在SQL Server 2008中比较不同行和不同列中的值

  12. 12

    如何在 SQL Server 中的时间戳和时间戳之间

  13. 13

    SQL:删除组中的不同行?

  14. 14

    SQL Server 2005中具有相同ID的不同行中的Concat列

  15. 15

    从 SQL 中的时间戳中提取时间

  16. 16

    如何在T-SQL中将一行中的时间范围拆分为不同行中的不同季度

  17. 17

    SQL获取登录和注销时间戳

  18. 18

    不同行的SQL总和

  19. 19

    SQL Server中同一个表的不同行同时读写

  20. 20

    Oracle时间戳到SQL Server DateTime

  21. 21

    SQL Server:PIVOT时间戳和计算

  22. 22

    SQL Server时间戳数据类型

  23. 23

    如何在 SQL Server 中对按重叠时间分组的持续时间求和

  24. 24

    SQL Server 中没有重叠时间的总持续时间

  25. 25

    SQL查询以获取不同事件中的时间间隔

  26. 26

    获取最新版本更改时间戳 SQL Server

  27. 27

    基于不同的时间戳/时间戳和用户选择的输入(T-SQL)的SQL分段/平均

  28. 28

    SQL Server:基于结果集的不同行的列上的将来值

  29. 29

    Oracle SQL中的时间戳转换

热门标签

归档