在Google Big Query(GBQ)中不完整实现窗口函数所需的解决方法

时间:2013-08-05 04:27:55

标签: google-bigquery

Google Big Query中最近公布的(和期待已久的)窗口分析功能似乎非常不完整。下面是一个查询,它应该计算公司的几个(示例中为3个)财务指标的综合加权分数(这适用于Oracle和MS SQL!):

select 
  (  percent_rank() over (order by cash_discount desc)*0.4
    +percent_rank() over (order by trailing_pe desc)*0.5
    +percent_rank() over (order by forward_pe desc)*0.5
  ) combined_weighted_score
 ,company_symbol, company_name
 from  workspace.company c

在GBQ中我们得到:错误:在第2行遇到“”OVER“”“”。

我决定进一步研究这个问题 - 这是一个更简单的查询:

select 
      percent_rank() over (order by cash_discount desc) r1
     ,percent_rank() over (order by trailing_pe desc) r2
     ,percent_rank() over (order by forward_pe desc) r3
     ,company_symbol, company_name
from  workspace.company c

让我这样:错误:尚不支持多个不同的OVER子句。如果查询中出现多个OVER子句,则它们必须相同。找到排序键0

中不同的AnalyticSpec

因此,GBQ似乎有非常不完整的分析窗口函数的实现! 接下来,我尝试了一些丑陋的黑客:

select c.company_name, (r1.r*0.4+r2.r*0.5) combined_weighted_score
from [workspace.company] c
left join (select company_symbol, percent_rank() over (order by cash_discount desc) r from workspace.company) r1 
  on c.company_symbol=r1.company_symbol
left join (select company_symbol, percent_rank() over (order by trailing_pe desc) r from workspace.company) r2 
  on c.company_symbol=r2.company_symbol

好吧,仍然不起作用:

错误:5.1 - 0.0:查询不能包含多个JOIN子句

任何解决方案?我知道在经典SQL中很难实现,没有正确实现的窗口函数的帮助。但是GBQ公告听起来非常有意思......

1 个答案:

答案 0 :(得分:2)

你几乎得到了它!

每个OVER()子句在同一个SELECT语句中都需要相同的谓词,但你可以加入2个不同的表 - 正如你所发现的那样。

只能连接2个表,但是你需要3.简单的解决方法是做一个子查询并加入一个。

而不是:

SELECT x.a, y.b, z.c
FROM x JOIN y ON x.j=y.j JOIN z ON y.j=z.j

你可以这样做:

SELECT x.a, yz.b, yz.c
FROM x JOIN (
  SELECT y.b b, z.c c, y.j j
  FROM y JOIN z on y.j=z.j) yz
ON x.j=yz.j

(您可能需要更改JOIN EACH的JOIN)