【发布时间】:2019-03-27 07:34:16
【问题描述】:
在 Sql server 语法或 bigquery 语法中是否有交叉应用的等价物。
我需要在没有交叉应用的情况下编写此查询:
select *
from t1
cross apply (select top 1 col1,col2,col3
from t2
where col1 = t1.col1
and (col2 = '0' or col2 = t1.col2)
and (col3 = '0' or (col3 = left(t1.col3) and t1.col4 = 'fr'))
order by col2 desc, col3 desc)
名为'Delivery'的t1包含交货信息:
Delivery_ID,Delivery_ShipmentDate,Country_Code,address_ZipCode and the providerservice_id
名为'ProviderService'的t2包含有关providerservice的信息:
Providerservice_id,DCountry_ID , DZone_Code as well as a numeric ProviderService_DeliveryTime.
所以每个 Delivery_ID 都有一个 ProviderService_ID 对于同一个 Providerservice,我们可以根据该表中的其他列(DCountry_ID,DZone_Code)有几个不同的 ProviderService_DeliveryTime
所以最终的查询将是:
Select t1.Delivery_ShipmentDate,t2.ProviderService_DeliveryTime
from Delivery t1
cross apply (select top 1 ProviderService_DeliveryTime,DCountry_ID , DZone_Code
from ProviderService
where ProviderService_id = t1.ProviderService_id
And (DCountry_ID = '0' or DCountry_ID = t1.Country_Code)
And (DZone_Code = '0' or (DZone_Code = left(t1.address_ZipCode,2) and t1.Country_Code='FR'))
order by t2.DCountry_ID desc, t2.DZone_Code desc)sq
事实上,我需要先在 sql server 语法中编写相同的查询,然后在 Bigquery 中编写它,因为 BigQuery 不识别“交叉应用”运算符。
我尝试用 row_number 窗口函数来做,但它不起作用:
with cte as (Select t1.Delivery_ShipmentDate,t2.ProviderService_DeliveryTime,row_number() over (partition by t2.providerservice_id order by t2.DCountry_ID desc, t2.DZone_Code desc) as num
from Delivery t1
inner join providerservice t2 on t1.providerservice_id = t2.providerservice_id
And (DCountry_ID = '0' or DCountry_ID = t1.Country_Code)
And (DZone_Code = '0' or (DZone_Code = left(t1.address_ZipCode,2) and t1.Country_Code='FR')))
select * from cte where num = 1
仅当我按 delivery_id 过滤时才有效:
with cte as (Select t1.Delivery_ShipmentDate,t2.ProviderService_DeliveryTime,row_number() over (partition by t2.providerservice_id order by t2.DCountry_ID desc, t2.DZone_Code desc) as num
from Delivery t1
inner join providerservice t2 on t1.providerservice_id = t2.providerservice_id
And (DCountry_ID = '0' or DCountry_ID = t1.Country_Code)
And (DZone_Code = '0' or (DZone_Code = left(t1.address_ZipCode,2) and t1.Country_Code='FR'))
where delivery_id = xxxx)
select * from cte where num = 1
谁能帮帮我?谢谢!!
【问题讨论】:
-
cross apply是 Microsoft 对标准cross join lateral的实现 - 也许适用于 BigQuery? -
不,很遗憾,横向交叉连接在 BigQuery 中不起作用
标签: sql-server google-bigquery