Связанные записи базы данных на основе времени - PullRequest
0 голосов
/ 28 сентября 2019

Я хотел бы сгруппировать строки на основе свободно понимаемых бизнес-правил

У меня есть данные о встречах в следующем формате.

  • Книга учета организована с 5-минутными интервалами (см. Время встречи ).Некоторые встречи будут занимать более длительные периоды времени, когда кратные 5-минутные интервалы будут использоваться для создания всей встречи.
  • Некоторые встречи связаны с Идентификатор клиента , а другие нет.
  • Все встречи будут иметь фамилию и имя в Информации о назначении, например, совещание по проекту: Тейлор, Джеймс

Таблица встреч выглядит следующим образом

ID| AppointmentTime         | Appointment                           |Client ID
23| 2019-09-30 09:15:00.000 | Project meeting :Taylor, James        | NULL  
34| 2019-09-30 09:20:00.000 | Project meeting :Taylor, James        | NULL
35| 2019-09-30 09:25:00.000 | Project meeting :Taylor, James        | NULL
36| 2019-09-30 10:25:00.000 | Pre sales : Hayes, John               | 2
47| 2019-09-30 10:30:00.000 | Project meeting :Manning, Richard     |425
50| 2019-09-30 14:30:00.000 | Closure meeting :Kuruvita, Peter      | NULL

Таблица клиентов выглядит следующим образом:

ID  | Last Name | First Name 
2   | Hayes     | John               
425 | Manning   |Richard
3   | Taylor    | James

Я хочу иметь возможность группировать встречи на основе приведенных ниже правил

  • все слоты встреч с одним и тем же идентификатором клиента с примыкающими слотами принадлежатодно и то же назначение
  • , где нет идентификаторов клиник, все слоты встреч с одинаковой комбинацией фамилии и имени с соседними слотами принадлежат одному и тому же назначению.Имена должны быть связаны с записями таблицы клиента, где это возможно
  • У некоторых клиентов еще нет записей в таблице клиентов.В этом случае NULL ID клиента должен быть возвращен
    • Существуют встречи, созданные для клиентов, которые существуют на вкладке клиента, но администраторы не могут связать их изначально

Ожидаемые результаты выглядят так:

ClientID |Clint Name            |Appointment Start      | Appointment End        | Appointment Destail
NULL     |Peter  Kuruvita       |2019-09-30 14:30:00.000|2019-09-30 14:34:00.000 |Closure meeting
3        |James Taylor          |2019-09-30 09:15:00.000|2019-09-30 09:29:00.000 |Project meeting 
2        |John  Hayes           |2019-09-30 10:25:00.000|2019-09-30 10:29:00.000 |Pre sale  
425      |Richard Manning       |2019-09-30 10:30:00.000|2019-09-30 10:34:00.000 |Project meeting

Не могли бы вы помочь с оператором SQL или фрагментами для разных частей, чтобы я мог собрать их вместе?Реализация в Microsoft SQL Server 2008 R2 (SP2)

Заранее спасибо

1 Ответ

0 голосов
/ 28 сентября 2019

Вы можете объединить таблицы, основанные на соседних слотах, и получить известные имена клиентов, используя подход с разницей номеров строк для пробелов и островков.

select clientid,
       (firstname + ' ' + lastname) as name,
       min(appointment_start),
       max(appointment_end)
from (select a.*,
             row_number() over (order by appointment_start) as seqnum,
             row_number() over (partition by clientid order by appointment_start) as seqnum_c             
      from appointment a
     ) a left join
     clients c
     on a.clientid = c.id
group by (seqnum - seqnum_c), a.clientid, c.lastname, c.firstname;

Примечание:Это предполагает, что смежные слоты для одного и того же клиента имеют одинаковое назначение.Если вы хотите разделить их, вам действительно нужно обновить базу данных до поддерживаемой версии SQL Server, чтобы вы могли использовать lag() и другие функциональные возможности.

В качестве примера данных вы также можете просто использоватьназвание встречи:

select clientid,
       (firstname + ' ' + lastname) as name,
       min(appointment_start),
       max(appointment_end)
from appointment a left join
     clients c
     on a.clientid = c.id
group by a.appointment, a.clientid, c.lastname, c.firstname;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...