Показать первый ряд, если есть дубликат и сложнее - PullRequest
0 голосов
/ 07 ноября 2018
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

1 Ответ

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

Если вы хотите первое сообщение для каждого стенограммы, вы можете использовать distinct on:

select distinct on (t.transcript_id) . . .
from chat_transcript t join
     chat_message m
     on t.transcript_id = m.transcript_id
order by t.transcript_id, m.id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...