当前位置:  开发笔记 > 编程语言 > 正文

Bigquery条件拆分聚合失败

如何解决《Bigquery条件拆分聚合失败》经验,为你挑选了1个好方法。

我有一个类别列,其中包含一个字符串,其中包含由"|"分隔的变量位置的子类别字段.每个子类别的位置取决于字符串中的项目数.例如:

category    subcat1    subcat2    subcat3
a|b|c       b          c          a
x|y|a|b     b          null       a

那么,要解决一个类别,我有:

SELECT
  a.category AS category,
  case
    WHEN COUNT(SPLIT(a.category, "|")) = 4 then nth(4, SPLIT(a.category, "|"))
    WHEN COUNT(SPLIT(a.category, "|")) = 3 then nth(2, SPLIT(a.category, "|"))
    WHEN COUNT(SPLIT(a.category, "|")) = 2 then nth(2, SPLIT(a.category, "|"))
    else null
  end as subcat1,
  --nth(2, SPLIT(a.category, "|")) as x      --uncomment for success.  see below
FROM
  [interim_groups.articles_unique] as a

运行此失败时:

SELECT clause has mix of aggregations 'subcat1' and fields 'category' without GROUP BY clause

现在我不想要一个group by子句,并且它没有任何意义,但如果我包含它,它开始抱怨范围的聚合,这似乎是在错误的方向.

如果我使用if语句而不是case语句,则会发生同样的情况.

现在这是奇怪的一点.如果我last(SPLIT(a.category, "|")) as x在查询中有注释行(或者替代),则查询会完美无缺.

这是一个错误吗?我的查询看起来正确,并且我的查询中有一个额外的列以某种方式使其通过是奇怪的.
有没有更好的方法来解决这个问题,而不仅仅是留在一个不必要的列来稳定查询?



1> Felipe Hoffa..:

查询缺少'WITHIN RECORD'关键字.

SELECT
  a.category AS category,
  case
    WHEN COUNT(SPLIT(a.category, "|")) = 4 then nth(4, SPLIT(a.category, "|"))
    WHEN COUNT(SPLIT(a.category, "|")) = 3 then nth(2, SPLIT(a.category, "|"))
    WHEN COUNT(SPLIT(a.category, "|")) = 2 then nth(2, SPLIT(a.category, "|"))
    else null
  end WITHIN RECORD as subcat1 ,
FROM (SELECT category FROM
  (SELECT 'a|b|c' category), (SELECT 'a|b' category), (SELECT 'a|b|c|d' category)) a

请参阅WITHIN的文档:

WITHIN关键字专门用于聚合函数,以便跨记录和嵌套字段中的子项和重复字段进行聚合.指定WITHIN关键字时,需要指定要聚合的范围 - WITHIN RECORD:聚合记录中重复值的数据.

https://cloud.google.com/bigquery/docs/data#within

推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有