为每个用户选择最新条目,而不使用group by(postgres)



我有一个包含四列的表myTable

id        UUID,
user_id   UUID ,
text      VARCHAR ,
date      TIMESTAMP

(id是主键,user_id在该表中是而不是唯一的(

我想检索按最新条目排序的user_id,我目前正在使用以下查询:

SELECT user_id FROM myTable GROUP BY user_id ORDER BY MAX(date) DESC

问题是GROUP BY需要很长时间。有没有更快的方法来实现这一点?我尝试使用PARTITION BY的窗口函数,如这里所述检索每个组中的最后一条记录MySQL,但它并没有真正加快速度。我还确保对user_id进行了索引。

我的postgres版本是10.4

编辑:我目前使用的上面的查询在功能上是正确的,问题是它很慢

您的查询似乎是满足您需求的相关方法:

select user_id 
from mytable 
group by user_id 
order by max(date) desc

我建议在(user, date desc)上建立一个索引以加快速度。它需要是两列上的单个索引。

您也可以尝试distinct on可能,也可能不会,这会给您带来更好的性能:

select user_id
from (
select distinct on(user_id) user_id, date
from mytable
order by user_id, date desc
) t
order by date desc

user_id, date desc上的索引开始。这可能会有所帮助。

你也可以尝试过滤——一旦你有了这样的索引:

select t.user_id
from myTable t
where t.date = (select max(t2.date)
from myTable t2
where t2.user_id = t.user_id
)
order by t.date desc

然而,您可能会发现order by最终花费的时间几乎与group by一样多。

这个版本肯定会使用子查询的索引:

select user_id
from (select distinct on (user_id) user_id, date
from myTable t
order by user_id, date desc
) t
order by date desc;

最新更新