2

BigQuery に保存されているいくつかのテーブルに対してクエリを実行する JavaScript でクライアント側アプリを開発するように依頼されたので、現在、クエリ構文を把握しています。

私のスキーマには、特に次のフィールドがあります。

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 を処理する可能性が 1 つありますが、優れたデータセットとさまざまなアドレスを持つさまざまなユーザーが多数いる場合 (想定どおり)、このアプローチは自殺行為に思えます。

そのため、特定の日のすべてのアドレスをフィールドに格納した配列を保存する方法があるかどうかを自問していました。このタプル構造を返してもらいたい:

+---------------+-------------------+--------------------+--------------------+
|    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 に答える