postgres group by aggregate function

joh*_*ire 6 sql postgresql group-by

我有一个消息表,看起来像这样:

+------------+-------------+----------+
| sender_id  |  created_at | message  |
+------------+-------------+----------+
|      1     | 2010-06-14  | the msg  |
|      1     | 2010-06-15  | the msg  |
|      2     | 2010-06-16  | the msg  |
|      3     | 2010-06-14  | the msg  |
+------------+-------------+----------|
Run Code Online (Sandbox Code Playgroud)

我想为每个发件人选择最近的单个邮件.

这看起来像GROUP BY sender_id和ORDER BY created_at,但我无法选择最新的消息.

我正在使用postgres,因此如果我想按该字段排序,则需要在SELECT语句中的created_at字段上使用聚合函数,因此我正在考虑做这样的事情作为初始测试

SELECT messages.sender_id, MAX(messages.created_at) as the_date 
FROM messages 
GROUP BY sender_id 
ORDER BY the_date DESC 
LIMIT 10;
Run Code Online (Sandbox Code Playgroud)

这似乎工作,但当我想选择'消息'时,我不知道在它上面使用什么聚合函数.我基本上只想要与MAX created_at对应的消息.

有没有办法解决这个问题,或者我是以错误的方式接近它?

Qua*_*noi 8

这个:

SELECT  *
FROM    (
        SELECT  DISTINCT ON (sender_id) *
        FROM    messages 
        ORDER BY
                sender_id, created_at DESC 
        ) q
ORDER BY
        created_at DESC
LIMIT 5
Run Code Online (Sandbox Code Playgroud)

或这个:

SELECT  (mi).*
FROM    (
        SELECT  (
                SELECT  mi
                FROM    messages mi
                WHERE   mi.sender_id = m.sender_id
                ORDER BY
                        created_at DESC
                LIMIT 1
                ) AS mi
        FROM    messages m
        GROUP BY
                sender_id
        ) q
ORDER BY
        (mi).created_at  DESC
LIMIT 5
Run Code Online (Sandbox Code Playgroud)

(sender_id, created_at)为此创建索引以快速工作.

您可能会发现这篇文章很有趣: