在一列上变得与众不同,另一列排序

时间:2019-03-22 14:31:54

标签: sql postgresql greatest-n-per-group

我正在为应用程序构建消息传递功能,我的数据库表如下所示:

messages:
  id
  senderId
  receiverId
  threadId   <-- every message is part of a thread
  createdAt

我有一个“消息”页面,其中每个消息线程都有一张卡片,但是我希望它在卡中显示最新消息作为每个线程的预览。这是我到目前为止编写的查询:

SELECT DISTINCT ON ("threadId") * FROM messages ORDER BY "createdAt" DESC;

所以我正在做DISTINCT ON ("threadId"),但是我也要选择所有列,因为我需要所有数据,这就是*子句后面有一个DISTINCT ON的原因。到目前为止,该查询工作正常,但现在在ORDER BY子句上失败了。我想返回上次创建的消息,但出现错误:

ERROR:  SELECT DISTINCT ON expressions must match initial ORDER BY expressions
LINE 1: SELECT DISTINCT ON ("threadId") * FROM messages order by "cr...

我了解我认为的错误(ORDER BY列必须与要应用DISTINCT ON的列相匹配),但是我不知道如何使查询成为我想要的, createdAt必须先确定其顺序。

1 个答案:

答案 0 :(得分:2)

ORDER BY中领先的表达式必须与DISTINCT ON中的表达式一致:

SELECT DISTINCT ON ("threadId") *
FROM   messages
ORDER  BY "threadId", "createdAt" DESC;

详细说明:


如果要以不同的方式对结果进行排序(如注释),则必须用第二个{{1 }}。参见:

或类似,取决于您的实际情况和要求。可能会有复杂性以获得最佳结果。最近的例子: