Я думал, что это будет довольно легко найти решение, но я не могу найти вопрос, который соответствует тому, что я пытаюсь сделать.Найти последние записи и отсортировать по created_at в Postgresql
Вот что я хотел бы видеть (этот запрос не работает):
SELECT DISTINCT ON (conversation_id)
*
FROM messages
ORDER BY created_at DESC
Другими словами, вернуть полные строки с самыми последними датами created_at где conversation_id отличается, а затем упорядочить по created_at DESC.
Я написал запрос ниже, который делает именно то, что я ищу, но я думаю, что я слишком усложнил его. Я также предположил, что самая последняя запись будет иметь самый высокий идентификатор и упорядочен по этому в подзапросе вместо «created_at» (он возвращает тот же порядок, что и created_at DESC, но менее дружелюбен к читателю).
SELECT
m.*
FROM (
SELECT
DISTINCT ON (conversation_id) conversation_id,
id
FROM messages
ORDER BY conversation_id, id DESC
) as t
INNER JOIN messages as m
ON t.id = m.id
ORDER BY t.id DESC
Любая помощь при составлении более простой версии этого запроса будет отличной.
Пример добавил разъяснений
Если таблица сообщений выглядит следующим образом:
id, conversation_id, created_at, subject
1, 2, "2014-10-21 00:01:00", "subject 1"
2, 43, "2014-10-21 00:02:00", "subject 2"
3, 12, "2014-10-21 00:03:00", "subject 3"
4, 2, "2014-10-21 00:04:00", "subject 4"
5, 43, "2014-10-21 00:05:00", "subject 5"
Запрос должен возвращать следующее:
id, conversation_id, created_at, subject
5, 43, "2014-10-21 00:05:00", "subject 5"
4, 2, "2014-10-21 00:04:00", "subject 4"
3, 12, "2014-10-21 00:03:00", "subject 3"
Спасибо за вход, но я уже понял. Я спрашиваю: «Есть более простое решение, чем второй запрос в моем вопросе выше». – newUserNameHere
Вы хотите разделить на chat_id, упорядочить по created_at, а затем выбрать те, которые были ранжированы <2? http://www.postgresql.org/docs/current/static/tutorial-window.html – Jayadevan
@newUserNameHere, непонятно, чего вы хотите. Первый запрос использует 'ORDER BY created_at', второй - нет. – vyegorov