0

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”“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 子句,则它们必须相同。找到排序键不同的 AnalyticSpecs 0

所以,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的公告听起来很有希望……

4

1 回答 1

2

你几乎明白了!

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

只能连接 2 个表,但您需要 3 个。简单的解决方法是执行子查询并 JOIN 那个。

代替:

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 更改为 JOIN EACH)

于 2013-08-05T17:44:15.697 回答