Вы можете объединить таблицы, основанные на соседних слотах, и получить известные имена клиентов, используя подход с разницей номеров строк для пробелов и островков.
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;