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