BigQuery SQL 语法错误 FOR 函数(“语法错误:预期的”)“但在 [7:18] 获得关键字 FOR”)

Posted

技术标签:

【中文标题】BigQuery SQL 语法错误 FOR 函数(“语法错误:预期的”)“但在 [7:18] 获得关键字 FOR”)【英文标题】:BigQuery SQL syntax error FOR function ("Syntax error: Expected ")" but got keyword FOR at [7:18]") 【发布时间】:2020-01-03 18:25:07 【问题描述】:

我需要根据 dev_id 在一列 (cont_url) 中连接数据。我能够使用此查询在 MS-SQL 中成功执行此操作,但我需要在 BigQuery 中执行此操作。

select
    dev_id,
    stuff(
    (SELECT '|||' + cont_url
      FROM `test_table_sample`
        WHERE  dev_id = a.dev_id
         FOR XML PATH (''))                --Error is here
        , 1, 1, '') as testlist
from
    `test_table_sample` as a
group by
    dev_id

当我在 Big Query 中安装表并尝试运行相同的查询时,出现语法错误。

预期为“)”,但在 [7:18] 得到关键字 FOR

我不知道我做错了什么以及 BigQuery 标准 SQL 语法与 T-SQL 有何不同。

我已经包含了一个示例数据表。

test_table_sample
dev_id  cont_url
Device1 Link1
Device1 Link2
Device1 Link3
Device1 Link4
Device2 anotherLink1
Device2 anotherLink2
Device2 anotherLink3
Device2 anotherLink4
Device2 anotherLink5

这是查询的结果。

Results 
dev_id  cont_url
Device1 Link1|||Link2|||Link3|||Link4
Device2 anotherLink1|||anotherLink2|||anotherLink3|||anotherLink4|||anotherLink5

【问题讨论】:

【参考方案1】:

BigQuery 允许您只聚合字符串。语法要简单得多:

select dev_id, string_agg(cont_url, '|||') as testlist
from `test_table_sample` as a
group by dev_id;

也就是说,我强烈建议您改用数组:

select dev_id, array_agg(cont_url) as testlist
from `test_table_sample` as a
group by dev_id;

比笨拙的分隔字符串要好得多。

【讨论】:

您好,非常感谢您的回答。我想没有办法将 url 数据放在一个单元格中(我将计算唯一的用户路径,并希望每个用户将所有链接放在一个单元格中) @Putnik 。 . . string_agg() 执行您在 SQL Server 中明确执行的操作。 array_agg() 可能更可取。 如果你好奇的话,两个都做!他们使用相同的聚合。

以上是关于BigQuery SQL 语法错误 FOR 函数(“语法错误:预期的”)“但在 [7:18] 获得关键字 FOR”)的主要内容,如果未能解决你的问题,请参考以下文章

SQL语法错误-CONCAT,控制台-BigQuery [关闭]

Google BigQuery 的 SQL 语法不存在

BigQuery 新的标准 SQL 语法是不是与“计数不同”完全一致?

BigQuery API:400 语法错误:预期关键字 JOIN 但得到“)”

BigQuery 中的函数名称区分大小写

google bigquery SQL group by 聚合函数