Это пример учебника ИМХО для демонстрации функций аналити c. Я предполагаю, что несколько сообщений могут повторяться между одной и той же парой клиент-пользователь в обоих направлениях, и вы хотите сгруппировать последующие сообщения, идущие в одном направлении вместе, используя идентификатор в качестве порядкового номера. Возможным решением может быть (несколько строк добавлены мной):
with t (id, client_id, message, user_id, incoming) as (values
(1 , 1 , 'Hi, anybody there?' , 2 , True),
(2 , 1 , 'I need help' , 2 , True),
(3 , 1 , 'Yes, I am here to help you.' , 2 , False),
(4 , 2 , 'Did you solve it yet?' , 5 , True),
(5 , 3 , 'Is my issue resolved?' , 5 , True),
(6 , 2 , 'yes, it is solved' , 5 , False),
(7 , 5 , 'Are you happy with us?' , 3 , False),
(8 , 5 , 'yes, very much' , 3 , True),
(9 , 1 , 'Hi, anybody there again?' , 2 , True),
(10 , 1 , 'I need help' , 2 , True),
(11 , 1 , 'Yes, I am here to help you.' , 2 , False),
(12 , 1 , 'Again.' , 2 , False)
), ch as (
select t.*
, case coalesce(incoming !=
lag(incoming) over (
partition by client_id, user_id
order by id
)
, true)
when true then 1
else 0
end as incoming_changed
from t
), groups as (
select ch.*
, sum(incoming_changed) over (
partition by client_id, user_id
order by id
) as grp
from ch
), grouped as (
select client_id
, string_agg(message, ' ') as message
, user_id
, incoming
, min(id) as min_id
from groups
group by client_id, user_id, grp, incoming
order by client_id, user_id, min_id
), paired as (
select grouped.*
, lead(min_id) over (
partition by client_id, user_id
order by min_id
) as response_id
from grouped
)
select pc.client_id
, pc.message as client_message
, pu.user_id
, pu.message as user_message
from paired pc
join paired pu on pc.response_id = pu.min_id
where pc.incoming
Объяснение: сначала определить, когда меняется направление разговора. Он разделяет строки на группы. Сообщения объединяются в каждой группе (см. CTE select * from grouped
). Затем соедините каждое сообщение клиента с ответом пользователя (если есть), который является следующим по идентификатору (я надеюсь, что этот столбец играет роль метки времени).
Здесь скрипт БД