加入2个表并仅保留第一个最近的事件

我有以下当前表:

table_1
id | timestamp | origin | info

table_2
id | timestamp | origin | type

我的目标是为表2中的每一行找到表1中的origin事件。我只想保留第一个事件。 例如:

table 1
1 | 1000 | "o1" | "i1"
2 | 2000 | "o2" | "i2"
3 | 2010 | "o2" | "i2"

table 2
1 | 1010 | "o1" | "t1"
2 | 2100 | "o2" | "t2"

我的预期结果是:

table_2.id | table_2.timestamp | table_2.origin | table_2.type | table_1.info | table_1.timestamp
1          | 1010              | "o1"           | "t1"         | "i1"         | 1000
2          | 2100              | "o2"           | "t2"         | "i2"         | 2010

目前,我只是在origintable_2.timestamp > table_1.timestamp上使用简单的联接,这给了我

table_2.id | table_2.timestamp | table_2.origin | table_2.type | table_1.info | table_1.timestamp
1          | 1010              | "o1"           | "t1"         | "i1"         | 1000
2          | 2100              | "o2"           | "t2"         | "i2"         | 2000
2          | 2100              | "o2"           | "t2"         | "i2"         | 2010

如您所见,我不需要上面的第二行,因为我只想要table_1中最接近的事件。

有什么想法吗?

dashantufei 回答:加入2个表并仅保留第一个最近的事件

跨数据库解决方案是使用相关子查询进行联接和过滤:

array(2) {
  'beg' =>
  NULL
  'fin' =>
  NULL
}

由于您使用的是Postgres,因此可以使用方便的语法select t2.*,t1.info,t1.timestamp t1_timestamp from table_2 t2 inner join table_1 t1 on t1.origin = t2.origin and t1.timestamp = ( select max(t11.timestamp) from table_1 t11 where t11.origin = t2.origin and t11.timestamp < t2.timestamp ) order by t2.id ;这实际上可能会更好:

distinct on

Demo on DB Fiddle -两个查询都产生:

id | timestamp | origin | type | info | t1_timestamp
-: | --------: | :----- | :--- | :--- | -----------:
 1 |      1010 | o1     | t1   | i1   |         1000
 2 |      2100 | o2     | t2   | i2   |         2010
本文链接:https://www.f2er.com/2933226.html

大家都在问