Время ответа двух сообщений в одном чате - PullRequest
0 голосов
/ 21 февраля 2019

Сценарий

Chat_channel может иметь несколько MESSAGE_ID, которые отображаются в отдельных строках.

INSERT INTO messages_tbl 
            (message_id, 
             chat_channel, 
             user_type, 
             message_type, 
             message_custom_type, 
             msg_created_on) 
VALUES      ('00001', 
             'chat_1', 
             'consumer', 
             'msg', 
             'example message', 
             '2018-09-27 10:14:42'); 

INSERT INTO messages_tbl 
            (message_id, 
             chat_channel, 
             user_type, 
             message_type, 
             message_custom_type, 
             msg_created_on) 
VALUES      ('00002', 
             'chat_1', 
             'merchant', 
             'msg', 
             'example message', 
             '2018-09-27 11:14:42'); 

В этом примере я хотел бы сравнить и рассчитать время ответа от первого сообщения, отправленного потребителем, до второго сообщения, отправленного продавцом.Эти данные о времени и дате находятся в столбце MSG_CREATED_ON.

Я могу выполнять расчеты, но пытаюсь использовать их в разных строках.Я попытался разделить их на CHAT_CHANNEL, но безуспешно ..

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Ниже будет один путь -

SELECT t1.chat_channel, 
       Timestampdiff(minute, t1.msgcreated_on, t2.messagecreated_on) 
FROM   (SELECT chat_channel, 
               Min(msgcreated_on) time1 
        FROM   message_tbl 
        WHERE  t1.user_type = 'CONSUMER' 
        GROUP  BY chat_channel) t1 
       INNER JOIN (SELECT chat_channel, 
                          Min(msgcreated_on) time2 
                   FROM   message_tbl 
                   WHERE  t1.user_type = 'MERHCANT' 
                   GROUP  BY chat_channel) t2 
               ON t1.chatchannel = t2.chatchannel 
0 голосов
/ 21 февраля 2019

Учитывая, что вы используете MySQL 8+, мы можем использовать аналитические функции.Вот один из подходов:

WITH cte AS (
    SELECT CHAT_CHANNEL, MSG_CREATED_ON,
        ROW_NUMBER() OVER (PARTITION BY USER_TYPE ORDER BY MSG_CREATED_ON) rn
    FROM MESSAGES_TBL
)

SELECT
    t1.CHAT_CHANNEL,
    t1.rn AS conversation_number,
    TIMESTAMPDIFF(MINUTE, t1.MSG_CREATED_ON, t2.MSG_CREATED_ON) AS diff_in_minutes
FROM cte t1
LEFT JOIN cte t2
    ON t1.CHAT_CHANNEL = t2.CHAT_CHANNEL AND
       t1.rn = t2.rn AND
       t1.USER_TYPE = 'consumer' AND
       t2.USER_TYPE = 'merchant'

Я использую ROW_NUMBER, чтобы назначить общее значение для каждого отдельного парного обмена между потребителем и продавцом для каждого канала чата.Затем я присоединяюсь к каналу чата, и разговор продолжается.

...