小编典典

Postgres,table1左联接table2,table1中每个ID仅包含1行

sql

好的,标题有点令人费解。这基本上是每组最大的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;

如果我将其作为子选择进行操作,我想我可以限制1,但是我一直听说它们效率极低。有什么想法吗?


阅读 223

收藏
2021-04-22

共1个答案

小编典典

DISTINCT ON是您的朋友。

select distinct on (user_id) * from user_stats order by datestamp desc;
2021-04-22