【发布时间】:2012-04-26 22:23:04
【问题描述】:
在 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()!
【问题讨论】:
-
如果您觉得他们需要总结一个完整的解决方案,或者如果有任何答案可以改进,您可以提出修改建议。
标签: postgresql group-by distinct distinct-on