【问题标题】:Workaround needed for the incomplete implementation of window functions in Google Big Query (GBQ)Google Big Query (GBQ) 中窗口函数实现不完整所需的解决方法
【发布时间】:2023-03-07 09:25:01
【问题描述】:

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 中我们得到:Error: Encountered " "OVER" "over "" at line 2.

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

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

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    你几乎明白了!

    每个 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)

    【讨论】:

    • 谢谢你!解决方法有效,但是这种不必要的嵌套 JOIN 不会赢得任何选美比赛:-)。我仍然希望 GBQ 团队监控客户的痛苦,并且在下一个版本中至少:1. 取消只有一种类型的限制在同一个 SELECT 2 中的 OVER 子句。意识到像 0.4*(percent_rank() over(...)) 这样的表达式是完全合法的谢谢 Fh。,解决方法有效!我仍然希望 GBQ 团队监控他们的客户的痛苦,并且至少会这样做:
    • 就我的经验而言 - GBQ 团队热爱他们的用户。感谢您的反馈,并继续提供:)。
    猜你喜欢
    • 2016-02-01
    • 1970-01-01
    • 2016-04-12
    • 2016-04-03
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    • 2021-07-27
    相关资源
    最近更新 更多