在 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 会从结果中排除一些 id。假设我有一个 id 列,我有 6 行是相同的。因此,从结果中排除它是不同的,但 rank() 只是结果。所以,使用 rank()!