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

wkyowqbh  于 2021-07-27  发布在  Java
关注(0)|答案(2)|浏览(264)

我有一张table 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
编辑:上面的查询,我目前使用的功能是正确的,问题是它的速度慢。

mhd8tkvw

mhd8tkvw1#

从索引开始 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;
nfg76nw0

nfg76nw02#

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

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

相关问题