2

我被要求用 javascript 开发一个客户端应用程序来查询存储在 BigQuery 上的一些表,所以目前我正在掌握查询语法。

我的架构除其他外具有以下字段:

download_speed: FLOAT
real_address: STRING
timestamp: INTEGER
upload_speed: FLOAT
[...]

我想找到不同日期聚合的平均上传和下载速度,并跟踪不同的 IP,所以我写了这个查询:

SELECT LEFT( FORMAT_UTC_USEC(UTC_USEC_TO_DAY(timestamp*1000000)),10) as date_day,
AVG (download_speed)avg_download,
AVG (upload_speed)avg_upload,
real_address
FROM [xxxxxxxxxxxx:xxxxxxx.xxxx]
GROUP BY date_day, real_address
ORDER BY date_day ASC

这没关系,但结果是平的,我需要每天汇总平均速度,以便我可以在时间轴上绘制它们。一种可能性是处理查询客户端返回的 json,但是对于大量的数据集和许多具有不同地址的不同用户(正如我们应该拥有的那样),这种方法对我来说听起来像是自杀。

所以我问自己是否有一种方法可以在一个字段中保存一个包含给定日期的所有地址的数组。我想返回这个元组结构:

+---------------+-------------------+--------------------+--------------------+
|    date_day   |   avg_download    |   avg_upload       |   real_addr_list   |
+---------------+-------------------+--------------------+--------------------+
|               |                   |                    |   79.20.xx.xx,     |
|   2013-01-13  |   510574.63       |    29599.92        |   151.46.xxx.xx,   |
|               |                   |                    |   151.70.xx.xx     |
+---------------+-------------------+--------------------+--------------------+

这是可能的,还是我被迫在 BigQuery 之外处理结果?

在此先感谢您的帮助。

4

1 回答 1

2

好的,我发现 BigQuery 支持 GROUP_CONCAT('str') 函数,用法如下:

将多个字符串连接成一个以逗号分隔的字符串,就像字符串的 SUM() 一样。将此与分组语句和 str 的字段名称一起使用,以将组中所有字符串值的列表连接成单个字符串

如果有人感兴趣,查询是:

SELECT LEFT( FORMAT_UTC_USEC(UTC_USEC_TO_DAY(timestamp*1000000)),10) as date_day,
AVG (download_speed)avg_download,
AVG (upload_speed)avg_upload,
GROUP_CONCAT(real_address)as real_address_list
FROM [xxxxxxx:xxxxx.xxxxx]
GROUP BY date_day
ORDER BY date_day ASC

希望这对其他人也有用。

于 2013-02-13T16:44:39.443 回答