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公告听起来非常有意思......
答案 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)