我有两个通过user_id关联的表,我需要在以下条件下联接这两个表:

  • 首先,它们应该与自己的用户相关
  • 其次,对于第一个表中的每个记录,它应该 Select 第二个表中创建日期与第一个最接近的相应记录.

请考虑以下两个表:

table_1
id user_id name created_at
1 11 A 2023-01-01 12:00:00
2 11 B 2023-01-01 12:08:00
3 22 C 2023-01-01 13:00:00
4 33 D 2023-01-01 14:00:00
table_2
id user_id created_at
1 11 2023-01-01 12:05:00
2 22 2023-01-01 13:03:00
2 22 2023-01-01 13:06:00
3 33 2023-01-01 14:12:00
expected result
id user_id name created_at t2_created_at
1 11 A 2023-01-01 12:00:00 2023-01-01 12:05:00
2 11 B 2023-01-01 12:08:00 null
3 22 C 2023-01-01 13:00:00 2023-01-01 13:03:00
4 33 D 2023-01-01 14:00:00 2023-01-01 14:12:00

推荐答案

横向联接的行为类似于Foreach循环.以下代码可在PostgreSQL中运行.在您的样本结果中,处理name个‘B’是一个左联侧边.交叉联接横向不返回该行.

select t1.*, t2.created_at as t2_created_at
  from table_1 t1
       left join lateral (select user_id, created_at
                             from table_2
                            where user_id = t1.user_id
                              and created_at >= t1.created_at
                            order by created_at
                            limit 1) t2
         on true;

Working fiddle

Sql相关问答推荐

在SQL Server中使用LEFT连接包含特定记录

Oracle SQL-将结果列在单行中

为什么在postgres中,横向连接比相关子查询快?

如何根据特定的内部json元素值过滤postgres查询结果?

如何在Presto中将多个列合并到一个数组中

SQL计数条目大于日期,包括交叉表中的零

Oracle PL/SQL:解决DBMS输出大小限制的问题

使用拆分器将已分组的不同值连接在一起

排除具有部分匹配条件的记录

在 Postgres 中将结果按几十年划分

每个分组最多 Select 最后 2 个值并并排显示它们

从每月生成的系列中生成每日汇率

错误:postgresql 中缺少表评级的 FROM 子句条目

如何 for each id创建长度等于id长度的不同日期序列?

使用长 IN 子句的 SQL 优化

更新之前如何获得价值

Snowflake中的动态SQL优化

使用给定的变量对在循环中执行更新语句

postgres按组消除分区中的NULLS

SQL日期比较用例;月初至今的报告