如何将交叉连接横向语句转换为大查询?

问题描述 投票:0回答:1

我的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
sql postgresql google-bigquery cross-join
1个回答
0
投票

如果没有横向联接,“等效”是 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 子句的一部分)。

© www.soinside.com 2019 - 2024. All rights reserved.