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对应的消息.
有没有办法解决这个问题,或者我是以错误的方式接近它?
这个:
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)为此创建索引以快速工作.
您可能会发现这篇文章很有趣:
| 归档时间: |
|
| 查看次数: |
8687 次 |
| 最近记录: |