получить группы записей - PullRequest
       3

получить группы записей

0 голосов
/ 07 сентября 2018

У меня есть sql-таблица с записями, которые имеют имя и биение-datetime. В идеальных условиях сердцебиение будет происходить каждые 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 голосов
/ 07 сентября 2018

Я просто предлагаю идею. Ваше требование не может быть удовлетворено прямыми объединениями, потому что каждый раз вам нужно сравнивать текущую запись с предыдущими значениями. Шаги, которые вы можете выполнить здесь

  1. Шаг 1: сгруппируйте таблицу по имени и сохраните ее в таблице Temp *
  2. Step2: запустить цикл while для каждой группы

Внутри петли1

  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. Сгруппируйте XYZ в UniqueIdentifier и найдите последнюю запись (максимальное время)
  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|
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...