2014-10-21 3 views
1

Я думал, что это будет довольно легко найти решение, но я не могу найти вопрос, который соответствует тому, что я пытаюсь сделать.Найти последние записи и отсортировать по 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" 

ответ

2

Там нет необходимости для присоединения:

select * 
from (
    select distinct on (conversation_id) * 
    from messages 
    order by conversation_id, id desc 
) t 
order by id desc 
0

Per documentation:

Выражение (ы) DISTINCT ON должно соответствовать крайним левым выражениям ORDER BY. Предложение ORDER BY обычно содержит дополнительные выражения (выражения), которые определяют желаемый приоритет строк в каждой группе DISTINCT ON.

Так что, если вы используете DISTINCT ON (conversation_id), вы должны начать предложение ORDER BY с тем же столбцом.

+0

Спасибо за вход, но я уже понял. Я спрашиваю: «Есть более простое решение, чем второй запрос в моем вопросе выше». – newUserNameHere

+0

Вы хотите разделить на chat_id, упорядочить по created_at, а затем выбрать те, которые были ранжированы <2? http://www.postgresql.org/docs/current/static/tutorial-window.html – Jayadevan

+0

@newUserNameHere, непонятно, чего вы хотите. Первый запрос использует 'ORDER BY created_at', второй - нет. – vyegorov

Смежные вопросы