В PostgreSQL я хочу получить всех пользователей сразу и упорядочить их по дате.
Это мой запрос:
SELECT id, useridx, isread, message, date
FROM messages
WHERE isread = 1
GROUP BY useridx
ORDER BY date DESC
Это образец данных:
------------------------------------------------------
+ id | useridx | isread | messsage | date +
------------------------------------------------------
1 | 1 | 0 | Hello | 2012-01-01
2 | 2 | 1 | Hi | 2012-01-02
3 | 3 | 1 | Test | 2012-01-03
4 | 3 | 0 | My Msg | 2012-01-04
5 | 4 | 1 | sadasd | 2012-01-05
6 | 4 | 1 | sdfsdfd | 2012-01-06
7 | 4 | 0 | sdfsdfsd | 2012-01-07
8 | 5 | 0 | 5345634 | 2012-01-08
9 | 6 | 0 | sdfdfsd | 2012-01-09
10 | 7 | 0 | sdfsdfsf | 2012-01-10
------------------------------------------------------
Теперь я хочу получить эту таблицу, сгруппировав их через useridx и упорядочив по дате.
Ожидаемый результат:
------------------------------------------------------
+ id | useridx | isread | messsage | date +
------------------------------------------------------
6 | 4 | 1 | sdfsdfd | 2012-01-06
3 | 3 | 1 | Test | 2012-01-03
2 | 2 | 1 | Hi | 2012-01-02
------------------------------------------------------
Фактический результат
ERROR: column "messages.date" must appear in the GROUP BY clause or be used in an aggregate function
Я также не хочу группировать дату. Я просто хочу сгруппировать с useridx и отсортировать их по дате DESC.
Любая помощь/идея приветствуется!
Примечание. :Я также пробовал Distinct. Не соответствует моим потребностям или я сделал неправильно.
Я очень запутался и застрял между DISTINCT ON
и rank()
методами.
Заключение: Для тех, кто столкнулся с такой же проблемой, может прочитать это как ответ. Ответы @kgrittn и @mu слишком короткие верны. Я буду продолжать использовать как ответы, так и схемы в своем проекте, и со временем я смогу понять, какой из них лучший -, я думаю -. Итак, выберите один из них и продолжайте свою работу. Вы будете в порядке.
Последнее обновление:Иногда Distinct On исключает некоторые идентификаторы из результата. Допустим, у меня есть столбец идентификаторов, и у меня есть 6 одинаковых строк. Таким образом, в отличие от исключения его из результата, НО ранг ()просто приводит его. Итак, используйте ранг ()!