当前位置: 首页 > 面试题库 >

BigQuery GROUP_CONCAT和ORDER BY

姬凡
2023-03-14
问题内容

我目前正在使用BigQuery和GROUP_CONCAT,它们工作得很好。但是,当我尝试像在SQL中那样将ORDER
BY子句添加到GROUP_CONCAT语句时,会收到错误消息。

因此,例如

SELECT a, GROUP_CONCAT(b ORDER BY c) FROM test GROUP BY a

如果我尝试指定分隔符,也会发生相同的情况。

关于如何解决这个问题的任何想法?


问题答案:

由于BigQuery不支持GROUP_CONCAT函数内的ORDER
BY子句,因此可以通过使用分析窗口函数来实现此功能。在BigQuery中,GROUP_CONCAT的分隔符只是该函数的第二个参数。下面的示例说明了这一点:

select key, first(grouped_value) concat_value from (
select 
  key, 
  group_concat(value, ':') over 
    (partition by key
     order by value asc
     rows between unbounded preceding and unbounded following) 
  grouped_value 
from (
select key, value from
(select 1 as key, 'b' as value),
(select 1 as key, 'c' as value),
(select 1 as key, 'a' as value),
(select 2 as key, 'y' as value),
(select 2 as key, 'x' as value))) group by key

将产生以下内容:

Row key concat_value     
1   1   a:b:c    
2   2   x:y

关于窗口规范的注释:查询使用“无界前行和无界后行之间的行”窗口规范,以确保分区内的所有行都参与GROUP_CONCAT聚合。根据SQL标准,默认窗口规范是“在无限制的前一行和当前行之间行”,这对于运行总和等操作很有用,但在此问题中将无法正常工作。

性能说明:尽管多次重新计算聚合函数看起来很浪费,但BigQuery优化器确实认识到由于窗口不变的结果将是相同的,因此每个分区只计算一次聚合。



 类似资料:
  • 问题内容: 我有这个代码。 http://jsfiddle.net/0tgL7u6e/ JavaScript 视图 我不知道为什么订单不起作用,为什么过滤器不起作用。 在另一个问题上,我读到一些关于对象无法过滤或排序的信息。但是我上面有一个对象数组。此外,它应该工作! 有什么问题? 问题答案: 要对过滤器使用跟踪,必须在过滤器后面添加按表达式跟踪。 这是工作

  • 问题内容: 关于它们有很多传说。我想知道真相。以下两个示例之间有什么区别? 问题答案: 不确定从何处获得传说,但: 提交按钮 与: IE6将在标记之间提交此按钮的所有文本,其他浏览器将仅提交值。使用可使您在按钮的设计上享有更大的布局自由度。从各种意图和目的看,它乍一看似乎很棒,但是各种浏览器怪癖使它有时很难使用。 在您的示例中,IE6将发送到服务器,而其他大多数浏览器将不发送任何内容。要使其跨浏览

  • 什么区别以及如何正确重写代码?

  • 我有实体项目与投标有一对多的关系 型号/项目。JAVA 模型/投标。JAVA 我想获取一个项目的附加出价,出价是按其金额排序的。但它似乎并不像预期的那样起作用 波斯特数据 选择 输出是

  • 我试图理解为什么下面两个代码块会产生不同的结果。 代码块1按预期工作,并返回从数据库中查找的提供程序的数组。另一方面,代码块2返回函数数组。在理解promissione.all()和async/await时,我觉得缺少了一些简单的东西。 代码块的差异如下: > 块1:创建许诺函数数组,然后使用map运算符将其包装在异步函数中。 块2:许诺函数的数组被创建为异步函数。因此,不调用map运算符。 如果

  • 问题内容: 我才刚刚开始研究SQL。 我有一个SQL Server 2008r2数据库,它将返回两个字段DocDate和InvValue。我需要将InvValues汇总为今天的MTD和YTD,所以看起来像 我已经做了大量的Google搜寻,并且可以使用SUM&DATEPART进行一项或多项,但是我坚持尝试两者兼而有之。 有人可以给我一些伪代码,以帮助我进一步谷歌。 谢谢@戈登·利诺夫(Gordon

  • 这个示例代码来自一本Java书籍,从墙上的99瓶啤酒到没有啤酒打印出这首歌。问题是,当墙上是1瓶啤酒时,它仍然写着瓶子。我试图通过在末尾添加部分来解决这个问题。但是,它仍然显示1瓶啤酒在墙上,我瓶啤酒在墙上。 我不知道该改变什么来解决这个问题。是否创建另一个while部分? 如果你能给他们一个提示,这样我就可以自己解决它,那也很酷!因为我知道我的实际歌曲输出是在第一个if部分,但我不知道我应该在哪

  • 原文地址:https://cesiumjs.org/tutorials/cesium-and-webpack/ Cesium 和 Webpack Webpack是非常强大非常流行的JavaScript 模块打包工具。它可以让开发人员以一种简单直观的 require 方式去加载各种页面需要的文件,极大的方便了开源人员对代码和资源文件进行结构化设计。当编译的时候,它会跟踪代码依赖性,把所有的模型打包到