postgresql SQL:如何为某列的每个值查找最新的行[重复]

pexxcrt2  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(3)|浏览(217)

此问题已在此处有答案

Select first row in each GROUP BY group?(20个回答)
16小时前关门了。
我想为每个chat_id查找最新的message条目。
例如,对于这个表,我需要获取行列表:对于chat_id = ee5152ff,id= 1c6bad12;对于chat_id = 29cc7217,id= e4485bdf。(第二和第六)。
| id|聊天ID|创建于|正文|
| - -----|- -----|- -----|- -----|
| 1442a8e8| ee5152ff| 2023-01-09 12:38:44.237280| hello1|
| 1c6bad12| ee5152ff| 2023-05-09 10:39:25.260409| hello3|
| 514c2db5| 29cc7217| 2023-02-14 09:05:20.284902| qwerty1|
| c4247480| ee5152ff| 2023-01-14 19:05:20.284902| hello2|
| e4485bdf| 29cc7217| 2023-06-14 11:05:20.284902| qwerty2|
现在我只有这样的疑问:

SELECT * 
FROM message
ORDER BY created_at DESC, id DESC;

但它会重新运行所有行

ht4b089n

ht4b089n1#

您的查询返回所有行,因为它所做的只是排序。
由于希望为每个chat_id返回一行,因此可以使用DISTINCT ON(注意,要在DISTINCT ON中使用的列必须作为ORDER BY中的初始列

SELECT DISTINCT ON (chat_id) *
FROM message
ORDER BY chat_id, created_at DESC;
oknwwptz

oknwwptz2#

这可以使用窗口函数row_number()为每个记录分配一个initiated id,每个记录按chat_id* 分组,按created_at**排序:

select *
from (
  select *, row_number() over (partition by chat_id order by created_at desc ) as rn
  from message
) as s
where rn = 1

Demo here

3xiyfsfu

3xiyfsfu3#

我创建了您的表,猜测VARCHAR(255)用于所有字符串值,TIMESTAMP用于日期/时间字段。这似乎工作。

select chat_id, max(created_at) from message group by chat_id;

相关问题