Sql 为每个用户选择最新条目而不使用分组依据(postgres)

Sql 为每个用户选择最新条目而不使用分组依据(postgres),sql,postgresql,datetime,sql-order-by,greatest-n-per-group,Sql,Postgresql,Datetime,Sql Order By,Greatest N Per Group,我有一个表myTable,有四列: id UUID, user_id UUID , text VARCHAR , date TIMESTAMP id是主键,用户id在此表中不唯一 我想检索按其最新条目排序的用户\u ID,我目前正在执行此查询: SELECT user_id FROM myTable GROUP BY user_id ORDER BY MAX(date) DESC 问题是分组需要很长时间。有没有更快的方法来实现这一点?我试着使用一个窗口函

我有一个表myTable,有四列:

id        UUID,
user_id   UUID ,
text      VARCHAR ,
date      TIMESTAMP
id是主键,用户id在此表中不唯一

我想检索按其最新条目排序的用户\u ID,我目前正在执行此查询:

SELECT user_id FROM myTable GROUP BY user_id ORDER BY MAX(date) DESC
问题是分组需要很长时间。有没有更快的方法来实现这一点?我试着使用一个窗口函数,分区方式如下所述,但它并没有真正加快速度。我还确保用户id已编入索引

我的博士后版本是10.4

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

从用户id、日期描述的索引开始。这可能会有所帮助

您也可以尝试筛选-一旦有了这样的索引:

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;

您的查询似乎与您的需求相关:

select user_id 
from mytable 
group by user_id 
order by max(date) desc
我会推荐一个关于用户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

按最新产品订购是什么意思?你想只看到你的标题所建议的最新条目还是所有条目,但有某种特殊的排序顺序?我想要所有的用户id,按每个用户id的最新日期排序。上面的查询是正确的,只是速度很慢。我不是在寻找完整的条目,只寻找用户id。那么,为什么不能简单地按用户id、日期描述的顺序从表中选择用户id?也许我解释得不好,我想要所有的用户id,但每个用户id只有一次。索引应该在用户id、日期上DESC@VesaKarjalainen:啊,是的,显然。。。谢谢。我最终喜欢这个PostgreSQL扩展。这非常方便。@GMB,现在,当然,我希望每个小组能保留多行。可能是用户id上的distinct 5?我知道,我知道。我要求的太多了,现在:D@TheImpaler:不,我不能那样做。。。在这种情况下,您需要采用传统的行数方法。添加索引加快了速度:。此外,您的两个建议都比我当前的查询快,尽管第一种方法给出了一些重复的建议,可能是因为某些用户ID有多个具有相同最新日期的条目。