chat_transcript
id | transcript_id | date
1 | 123 | 2018-11-04
2 | 234 | 2018-11-05
3 | 345 | 2018-11-06
chat_message
id | transcript_id | text | author
1 | 123 | a | null
2 | 123 | b | Tom
3 | 123 | c | Paul
4 | 234 | d | null
5 | 345 | e | Bryan
6 | 345 | f | Bryan
Я хочу такой результат
id | transcript_id | date | text | author
1 | 123 | 2018-11-04 | a | Tom
2 | 234 | 2018-11-05 | d | null
3 | 345 | 2018-11-06 | e | Bryan
Я хочу соединить chat_transcript и chat_message вместе transcript_id,
когда пользователь отправит первое сообщение chat_message, автор будет пуст, пока агент не отправит сообщение. Но я хочу сделать API для сводки для этого чата. В основном я хочу получить первый ряд каждого чата (каждый чат имеет одинаковый transcript_id).
Я хочу захватить id = 1,4,5,6.
Я знаю, что могу сделать с
select distinct on (m.transcript_id)
*
from chat_transcript as t
join chat_message as m on t.id = m.transcript_id
но вот сложная часть, если автор нулевой, я хочу посмотреть другие строки, которые имеют значение. если есть значение, я хочу заменить значение нулевым значением
Я нашел способ работать, но я все еще чувствую себя не совсем чистым.
select distinct on (n.transcript_id)
t.id, t.date, n.transcript_id, n.text, n.author
form chat_transcript as t
join (
select
m.id, m.transcript_id, m.text, a.author
from chat_message as m
join (
select
t.id, string_agg(distinct m.author, ', ') as author
from chat_transcript as t
join chat_message as m on t.id = m.transcript_id
group by t.id
) as a on m.transcript_id = a.id
) as n on t.id = n.transcript_id
маленькая очищенная версия
select distinct on (m.transcript_id)
nt.id, nt.date, m.index, m.text, nt.author
from chat_message as m
join (
select
t.id, t.date, string_agg(distinct m.author, ', ') as author
from chat_transcript as t
join chat_message as m on t.id = m.transcript_id
group by t.id
) as nt on m.transcript_id = nt.id