Select 每个用户的最新条目,不使用分组依据 (postgres)
Select newest entry for each user without using group by (postgres)
我有一个包含四列的 table myTable
:
id UUID,
user_id UUID ,
text VARCHAR ,
date TIMESTAMP
(id
是主键而user_id
是不是在这个table)
我想检索按最新条目排序的 user_id
s,我目前正在使用此查询执行此操作:
SELECT user_id FROM myTable GROUP BY user_id ORDER BY MAX(date) DESC
问题是 GROUP BY
需要很长时间。有没有更快的方法来完成这个?我尝试将 window 函数与 PARTITION BY
一起使用,如此处 Retrieving the last record in each group - MySQL 所述,但它并没有真正加快速度。我还确保 user_id
已编入索引。
我的 postgres 版本是 10.4
编辑:我目前使用的上面的查询在功能上是正确的,问题是它很慢。
从 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;
您的查询似乎与您的要求相关:
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
我有一个包含四列的 table myTable
:
id UUID,
user_id UUID ,
text VARCHAR ,
date TIMESTAMP
(id
是主键而user_id
是不是在这个table)
我想检索按最新条目排序的 user_id
s,我目前正在使用此查询执行此操作:
SELECT user_id FROM myTable GROUP BY user_id ORDER BY MAX(date) DESC
问题是 GROUP BY
需要很长时间。有没有更快的方法来完成这个?我尝试将 window 函数与 PARTITION BY
一起使用,如此处 Retrieving the last record in each group - MySQL 所述,但它并没有真正加快速度。我还确保 user_id
已编入索引。
我的 postgres 版本是 10.4
编辑:我目前使用的上面的查询在功能上是正确的,问题是它很慢。
从 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;
您的查询似乎与您的要求相关:
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