У меня есть таблица с журналами разговоров. Каждое сообщение представляет собой строку таблицы, и каждый диалог состоит из нескольких строк, которые имеют одинаковые значения conversationId
.
Я выбираю уникальные conversationId
s за последний месяц вместе с другими столбцами (такими как текст и метка времени) из самого последнего сообщения в каждом диалоге.
Это прекрасно работает, и запрос занимает около 1 секунды или меньше:
SELECT
*
FROM
(
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY conversationId ORDER BY id DESC) AS rn
FROM Logs
WHERE
timestamp >= DATEADD(month, -1, GETDATE())
) AS t
WHERE
t.rn = 1
ORDER BY
timestamp DESC
Теперь я также хочу добавить новый столбец messageCount
, в котором содержится количество всех сообщений за любое время для каждого conversationId
.
Для этого я добавил еще одну строку в запрос:
SELECT
*,
(SELECT COUNT(id) FROM Logs WHERE conversationId = t.conversationId) AS messageCount
FROM
(
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY conversationId ORDER BY id DESC) AS rn
FROM Logs
WHERE
timestamp >= DATEADD(month, -1, GETDATE())
) AS t
WHERE
t.rn = 1
ORDER BY
timestamp DESC
Возвращает правильные результаты, но в пять раз медленнее, чем 5 секунд, когда в результирующей таблице всего 14 строк.
Что я здесь не так делаю и как мне сделать этот запрос быстрее?