Google bigquery Bigquery条件拆分聚合失败

Google bigquery Bigquery条件拆分聚合失败,google-bigquery,Google Bigquery,我有一个category列,其中包含一个字符串,其中子类别字段位于由“|”分隔的可变位置。每个子类别的位置取决于字符串中的项目数。例如: category subcat1 subcat2 subcat3 a|b|c b c a x|y|a|b b null a 因此,为了解决一个类别,我有: SELECT a.category AS category, case WHEN C

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

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
现在我不想要一个
GROUPBY
子句,拥有它也没有意义,但是如果我包含它,它会开始抱怨作用域聚合,这似乎是朝着错误的方向发展

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

现在是奇怪的一点。如果在我的查询中有注释行(或者是
最后一行(SPLIT(a.category,“|”)作为x
),那么查询将完美地通过

这是虫子吗?我的查询看起来是正确的,查询中有一个额外的列以某种方式使其通过是很奇怪的。
有没有比只留下一个不必要的列来稳定查询更好的方法来解决这个问题呢?

我认为使用管道分隔字符串可以相对容易地提取最后一个组件

同时,在下面的版本中使用-对于可能更复杂的场景来说,它有点强大

SELECT
  a.category AS category,
  CASE
    WHEN LENGTH(REGEXP_REPLACE(a.category, r"[^|]", "")) = 4 
           THEN REGEXP_EXTRACT(a.category, r'\|\w+\|\w+\|\w+\|(\w+)')
    WHEN LENGTH(REGEXP_REPLACE(a.category, r"[^|]", "")) = 3 
           THEN REGEXP_EXTRACT(a.category, r'\|\w+\|\w+\|(\w+)')
    WHEN LENGTH(REGEXP_REPLACE(a.category, r"[^|]", "")) = 2 
           THEN REGEXP_EXTRACT(a.category, r'\|\w+\|(\w+)')
    ELSE NULL
  END AS subcat1
FROM your_table a

没有分组,没有不必要的列作为问题

查询缺少“in 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关键字专门与聚合函数一起工作,以便在记录和嵌套字段中的子字段和重复字段之间进行聚合。指定INTERSION关键字时,需要指定要聚合的范围- 在记录内:在记录内的重复值中聚合数据


很好的解决方案!但是,看看“内部”如何解决这个问题的替代答案。完全同意!内在是通往这里的道路。投赞成票!我的查询实际上是从regex开始的,但是regex变得很混乱,因为不是“|”之间的所有字符串都被捕获为一个完整的单词(例如连字符)