Выберите последний элемент для каждого уникального значения столбца - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть таблица, содержащая журналы сообщений.Каждый разговор имеет идентификатор разговора.

Я хочу выбрать отдельные идентификаторы разговора, и для каждого из них найти последнее сообщение с этим идентификатором разговора и присоединить его к строке.

Это то, что я пробовал, но это не такДобавить в таблицу все данные, кроме двух столбцов (conversationId и id).Я хочу получить все столбцы из этой таблицы для каждой строки с самой последней

SELECT 
  logs.conversationId, 
  -- latest message id
  MAX(logs.id) AS id
  FROM [dbo].[Logs] AS logs

  -- trying to get the remaining columns for the last message with that conversation ID
  LEFT JOIN [dbo].[Logs] AS logs2 ON logs.id = logs2.id

  WHERE 
    -- only conversations for last month
    logs.timestamp >= DATEADD(month, -1, GETDATE())

  GROUP BY logs.conversationId

Когда я пытаюсь добавить другой столбец в SELECT, я получаю сообщение об ошибке, в котором говорится, что мне нужно добавить этот столбец в GROUP BY пункт.Но это приводит к тому, что оператор выполняется в течение очень длительного времени, более 20 секунд, для всего лишь нескольких десятков строк в результате.

Ответы [ 3 ]

0 голосов
/ 17 сентября 2018

Сначала получите максимальный идентификатор журнала для каждого преобразования из журналов, а затем примените левое соединение:

select * from 
(SELECT 
  logs.conversationId, 
  MAX(logs.id) AS id
  FROM [dbo].[Logs] AS logs group by logs.conversationId)a
left join [dbo].[Logs] AS logs2 ON a.id = logs2.id and a.conversationid=logs.conversationid
0 голосов
/ 17 сентября 2018

Я бы использовал подзапрос в where, чтобы сделать его.

select * 
from logs t 
where t.id = (
    SELECT MAX(tt.id)
    from logs tt
    WHERE tt.conversationId = t.conversationId
    GROUP BY tt.conversationId
)

Примечание

если вы сделаете индекс в id, может быть быстрее, чем row_number версия

0 голосов
/ 17 сентября 2018

использование row_number() функция

select * 
from (
    select *, 
           row_number() over(partition by conversationId order by id desc) as rn 
    from logs 
) as t where t.rn=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...