当前位置: 首页 > 面试题库 >

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

夏华藏
2023-03-14
问题内容

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


 类似资料:
  • 我有一个包含字段“stock_id”的Table1Stocks和包含为每个股票订购的产品的Table2Productsordered以及一个Table3Store,每次有人更新Table1Stocks并将字段“Status”更改为“Received”时,我需要将Table2Productsordered中的行插入到Table3Store,其中Table2Productsordered字段“id_s

  • 问题内容: 我是PostgreSQL的新手,正在尝试从SQL Server转换查询。 我有一个表Users,其中包括bUsrActive,bUsrAdmin和sUsrClientCode列。我想更新用户并设置bUsrActive = false,如果不存在另一个具有相同sUsrClientCode的用户,其中bUsrAdmin = true和bUsrActive = true。 在SQL Serv

  • 给定table1.column1,我需要确定它是否有table2.column2的外键。 这个SQL将运行很多次,所以它需要相当快。 我见过一些解决方案,但是往往比我需要的更复杂(例如,数据库中的所有外键或表上的所有外键) 谢谢!

  • 问题内容: 我读了许多关于仅获得左联接的第一行的主题,但是由于某种原因,这对我不起作用。 这是我的结构(当然是简化的) 提要 艺人 feeds_artists 现在,我想获取文章并仅加入第一位艺术家,我想到了这样的事情: 只是仅获取feeds_artists的第一行,但已经行不通了。 由于数据库原因,我无法使用,也无法按结果对结果进行分组(因为我需要按日期对它们进行排序(我通过这种方式对结果进行分

  • 我读过很多关于只获得左联接的第一行的文章,但是,由于某些原因,这对我不起作用。 这里是我的结构(当然是简化的) 源 只获得feeds_artists的第一行,但这已经不起作用了。 由于数据库的原因,我不能使用并且我不能按对结果进行分组,因为我需要按日期对它们进行排序(我通过这样分组得到了结果,但结果不是最新的) 也尝试了一些外用的东西--也没有成功。老实说,我真的想象不出这些排是怎么回事--这可能

  • 我有5张桌子要放在一起。表格包括:访客、报价、合同1、合同2和合同3。 查询: 这里的问题是,contracts1、contracts2和contracts3并没有公共列以便连接在一起。因此,我得到的不是合同1的20行,合同2的30行,合同3的50行,而是所有这些的组合。因为它们是根据访问者和提供的表加入的。查询结束时使用简单的GROUP BY通常可以解决问题,但如果我在最后对其中一个表(或所有表