好的,标题有点令人费解。这基本上是每组最大的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,但是我一直听说它们效率极低。有什么想法吗?
DISTINCT ON是您的朋友。
select distinct on (user_id) * from user_stats order by datestamp desc;