获取记录组

时间:2018-09-07 08:19:06

标签: sql sql-server tsql

我有一个带有名称和心跳日期时间的条目的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 个答案:

答案 0 :(得分:0)

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

  1. 第1步:将表分组在“名称”上,并将其保存在“临时”表中
  2. 第2步:为每个组运行while循环

内部loop1

  1. 第3步:为每个条目(人名,可能是 两个人一样

内部循环2

  1. 第4步:为每个人提供一个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. 使用等级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|