Postgres, table1左键连接table2,table1中每个ID只有1行。[英] Postgres, table1 left join table2 with only 1 row per ID in table1

本文是小编为大家收集整理的关于Postgres, table1左键连接table2,table1中每个ID只有1行。的处理方法,想解了Postgres, table1左键连接table2,table1中每个ID只有1行。的问题怎么解决?Postgres, table1左键连接table2,table1中每个ID只有1行。问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

好的,所以标题有点复杂.这基本上是一个每组最大 n 类型的问题,但我一生都无法弄清楚.

我有一张表,user_stats:

------------------+---------+---------------------------------------------------------
 id               | bigint  | not null default nextval('user_stats_id_seq'::regclass)
 user_id          | bigint  | not null
 datestamp        | integer | not null
 post_count       | integer | 
 friends_count    | integer | 
 favourites_count | integer |  
Indexes:
    "user_stats_pk" PRIMARY KEY, btree (id)
    "user_stats_datestamp_index" btree (datestamp)
    "user_stats_user_id_index" btree (user_id)
Foreign-key constraints:
    "user_user_stats_fk" FOREIGN KEY (user_id) REFERENCES user_info(id)

我想通过最新的时间戳获取每个 id 的统计信息.这是一个很大的表,大约有 41m 行,所以我创建了一个 user_id, last_date 的临时表,使用:

CREATE TEMP TABLE id_max_date AS
    (SELECT user_id, MAX(datestamp) AS date FROM user_stats GROUP BY user_id);

问题在于 datestamp 不是唯一的,因为一天内可能有超过 1 次统计更新(应该是一个真正的时间戳,但设计这个的人有点白痴,并且有太多数据可以返回眼下).因此,当我执行 JOIN 时,某些 ID 有多行:

SELECT user_stats.user_id, user_stats.datestamp, user_stats.post_count,
       user_stats.friends_count, user_stats.favorites_count
  FROM id_max_date JOIN user_stats
    ON id_max_date.user_id=user_stats.user_id AND date=datestamp;

如果我将其作为子选择执行,我想我可以 LIMIT 1,但我一直听说那些效率极低.想法?

推荐答案

DISTINCT ON 是你的朋友.

select distinct on (user_id) * from user_stats order by datestamp desc;

本文地址:https://www.itbaoku.cn/post/1763879.html