sql - 获取记录组
问题描述
我有一个带有名称和心跳日期时间的条目的 sql 表。在完美的情况下,心跳每 10 分钟发生一次:
|Name|Heartbeat |
|A |20180907 09:10:00|
|A |20180907 09:20:00|
|A |20180907 09:30:00|
现在我有更多的人:
|Name|Heartbeat |
|A |20180907 09:10:00|
|B |20180907 09:15:00|
|A |20180907 09:20:00|
|B |20180907 09:25:00|
|A |20180907 09:30:00|
我什至可以从另一个同名的人那里得到同名。我只能通过他们的心跳来区分他们。
|Name|Heartbeat |
|A |20180907 09:10:00|
|A |20180907 09:15:00| --> Second A
|A |20180907 09:20:00|
|A |20180907 09:25:00| --> Second A
|A |20180907 09:30:00|
|A |20180907 09:35:00| --> Second A
|A |20180907 09:45:00| --> Second A
有时,心脏可以跳过一些节拍(有时几个小时)
|Name|Heartbeat |
|A |20180907 09:10:00|
|A |20180907 09:20:00|
|A |20180907 16:46:00|
|A |20180907 16:56:00|
|A |20180907 17:06:00|
最后但并非最不重要的一点是:在正常情况下,心跳并不是每 10 分钟发生一次,而是提前几秒钟(我没有看到后来的心跳,但我不排除这种可能性):
|Name|Heartbeat |
|A |20180907 09:59:02|
|A |20180907 10:08:50|
|A |20180907 10:18:04|
|A |20180907 10:27:50|
我想要什么:我想获得人员及其持续时间。所以假设我有下表:
|Name|Heartbeat |
|A |20180907 09:59:02|
|B |20180907 10:05:50|
|A |20180907 10:08:50|
|B |20180907 10:15:20|
|A |20180907 10:18:04|
|A |20180907 10:27:50|
|B |20180907 13:00:50|
|B |20180907 13:03:42| --> second B
|B |20180907 13:10:10|
|B |20180907 13:12:56| --> second B
|C |20180907 13:15:30|
|B |20180907 13:19:46|
|C |20180907 13:25:01|
|C |20180907 13:34:53|
我想得到以下结果:
|Name|Duration|StartTime|EndTime |
|A |00:28:48|09:59:02 |10:27:50|
|B |00:09:30|10:05:50 |10:15:20|
|B |00:18:56|13:00:50 |13:19:46|
|B |00:09:14|13:03:42 |13:12:56|
|C |00:19:23|13:15:30 |13:34:53|
使用 T-SQL 是否有可能(我不知道确切的 SQL Server 版本,但我想它至少是 SQL Server 2014)?我什至没有起点。因此,如果有人能给我一个正确方向的提示,我将非常感激。
我在想游标会有所帮助,但我不知道如何以有帮助的方式应用它们。
解决方案
我只是建议这个想法。直接连接无法满足您的要求,原因是每次您需要将当前条目与以前的值进行比较。您可以在此处执行的步骤是
- 步骤 1:按 Name 对表进行分组并将其保存在 Temp 表中
- Step2:为每个组运行while循环
内循环1
- Step3:为每个条目运行另一个循环(人名,两个可能相同)
内循环2
- 第 4 步:为每个人提供一个 UniqueIdentifier,并与 uniqueIdentifier 的最后一次心跳值进行比较,在 10 分钟范围内最接近匹配。并将其保存在表格 XYZ 中
例如从
|B |20180907 10:05:50|
在 XYZ 中添加以下条目
1D13EA00-58ED-4079-86AF-F103364D62CF |B |20180907 10:05:50|
下一个
|B |20180907 10:15:20|
- 在 UniqueIdentifier 上分组 XYZ 并找到最后一个条目(最大时间)
- 查找与当前条目的时间差。选择你范围内的那个。在这里,您必须对它们进行排名
- 使用 Rank 1 的标识符并插入具有相同的当前条目
- 如果它不在其中任何一个范围内,则创建一个新标识符
注意:我没有涵盖很多天没有病人进入的场景。在这种情况下,您必须每 10 分钟创建一个偏移量。例如,您只有这 2 个条目
|A |20180907 09:59:02|
|A |20180908 09:57:02|
在上述情况下,您必须抵消 |20180907 09:59:02| 的时间 有 143 个 10 分钟的间隔。所以,你会比较
|A |20180908 09:49:02| //instead of |A |20180907 09:59:02|
和
|A |20180908 09:57:02|
推荐阅读
- react-native - 在 react-native 中使用 odata
- c# - 从另一个方法调用参数
- php - 通过php执行windows脚本
- angular - 在Angular中,如何更改primeng的滑块手柄的手柄?
- scala - 用于“FileInputStream / FileOutputStream & Property”的 Scala 包
- r - 是否可以通过在 R 中使用整数来获得性能优势?
- bash - tput:在 Sublime Text3 中没有指定 $TERM 的值和没有 -T
- c# - 通过 MouseDown 创建一个圆圈并移动它
- jquery - 一年前的默认日期从今天开始使用物化
- php - 使用 Woocommerce 应用第二个产品的折扣