首页 > 解决方案 > 获取记录组

问题描述

我有一个带有名称和心跳日期时间的条目的 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)?我什至没有起点。因此,如果有人能给我一个正确方向的提示,我将非常感激。

我在想游标会有所帮助,但我不知道如何以有帮助的方式应用它们。

标签: sqlsql-servertsql

解决方案


我只是建议这个想法。直接连接无法满足您的要求,原因是每次您需要将当前条目与以前的值进行比较。您可以在此处执行的步骤是

  1. 步骤 1:按 Name 对表进行分组并将其保存在 Temp 表中
  2. Step2:为每个组运行while循环

内循环1

  1. Step3:为每个条目运行另一个循环(人名,两个可能相同)

内循环2

  1. 第 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|
  1. 在 UniqueIdentifier 上分组 XYZ 并找到最后一个条目(最大时间)
  2. 查找与当前条目的时间差。选择你范围内的那个。在这里,您必须对它们进行排名
  3. 使用 Rank 1 的标识符并插入具有相同的当前条目
  4. 如果它不在其中任何一个范围内,则创建一个新标识符

注意:我没有涵盖很多天没有病人进入的场景。在这种情况下,您必须每 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|

推荐阅读