我的sql语句是在postgres sql中使用横向交叉连接编写的。但我想在google bigquery中执行这个sql语句,而bigquery不支持横向交叉连接。我如何为bigquery引擎重写这个sql?
select
left_table.*,x.*
from
data left_table
cross join lateral
(
select string_agg(right_table.session_id,',')
from
data right_table
where left_table.source_ip = right_table.source_ip
and
((right_table.session_start_time >= left_table.session_start_time and right_table.session_start_time <= left_table.session_end_time)
or
(right_table.session_end_time >= left_table.session_start_time and right_table.session_end_time <= left_table.session_end_time))
group by right_table.source_ip
) x
如果没有横向联接,“等效”是 select 子句中的“相关子查询”,这些通常是性能问题,因为相关子查询是通过结果集逐行执行的:
SELECT
left_table.*
, (SELECT string_agg(right_table.session_id, ',')
FROM data right_table
WHERE left_table.source_ip = right_table.source_ip
AND (
(
right_table.session_start_time >= left_table.session_start_time
AND right_table.session_start_time <= left_table.session_end_time
)
OR (
right_table.session_end_time >= left_table.session_start_time
AND right_table.session_end_time <= left_table.session_end_time
)
)
GROUP BY right_table.source_ip) x
FROM data left_table
nb:横向连接以更有效的方式执行(作为 from 子句的一部分)。