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

标签 sql postgresql datetime sql-order-by greatest-n-per-group

我有一个包含四列的表 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 的窗口函数,如此处所述 Retrieving the last record in each group - 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

关于sql - 为每个用户选择最新条目,而不使用 group by (postgres),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63155800/

相关文章:

mysql - 将时间添加到 MySQL 日期时间

python - 如何将多个 gpx 文件加载到 PostGIS 中?

sql - 如何检查SQL数据库中是否存在函数?

postgresql - ActiveRecord - 搜索具有多个值的 Postgres 数组?

sql - 将两个 count(*) 结果相加

hibernate - 使用 Hibernate 注释映射 PostgreSQL 串行类型

sql - 查找序列中未缺失的列中的上一个数字

r - 将秒转换为天 : hours:minutes:seconds

MySQL - 组中组

mysql - 错误 : #1436 - Thread stack overrun with MySQL trigger