Sql 为每个用户选择最新条目而不使用分组依据(postgres)
我有一个表myTable,有四列: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 问题是分组需要很长时间。有没有更快的方法来实现这一点?我试着使用一个窗口函
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有多个具有相同最新日期的条目。