2016-08-18 11 views
0

私はLegacySQLを使用していますが、厳密にはそれに限定されません。 (しかし、私は役に立つと思ういくつかのメソッドを持っていますが、例えば "HASH"など)。BigQuery:グループ全体で繰返しフィールドを選択

いずれにしても、簡単な作業は、ネストされた+繰り返しのデータセットの最初のインスタンスをそのまま維持しながら、1つのトップレベル列でグループ化することです。

ので、次は「作品」、およびネストされた出力を生成します

SELECT 
    cd, 
    subarray.* 
FROM [magicalfairy.land] 

そして今、私はちょうど全体の最初の部分配列(正直、私はこれは当然のことながら働くことを期待しないでください) をつかむしようとし以下では動作しないものです:

SELECT 
    cd, 
    FIRST(subarray.*) 
FROM [magicalfairy.land] 
GROUP BY cd 

どれ代替手法いただければ幸いです。


編集、データの動作例。

入力データは、大きくした場合:

[ 
    { 
     "cd": "something", 
     "subarray": [ 
      { 
       "hello": 1, 
       "world": 1 
      }, 
      { 
       "hello": 2, 
       "world": 2 
      } 
     ] 
    }, 
    { 
     "cd": "something", 
     "subarray": [ 
      { 
       "hello": 1, 
       "world": 1 
      }, 
      { 
       "hello": 2, 
       "world": 2 
      } 
     ] 
    } 
] 

が出ることを期待する:

[ 
    { 
     "cd": "something", 
     "subarray": [ 
      { 
       "hello": 1, 
       "world": 1 
      }, 
      { 
       "hello": 2, 
       "world": 2 
      } 
     ] 
    } 
] 
+0

何を2番目の質問の結果として期待していますか?最初のもので何が「間違っていますか? –

+0

が更新されましたか? – CasualT

+1

これは明らかです –

答えて

1

あなたがはるかに良い時間例えば、標準SQLを使用して構造を維持する必要があります:

WITH T AS (
    SELECT 
    cd, 
    ARRAY<STRUCT<x INT64, y BOOL>>[ 
     STRUCT(off, MOD(off, 2) = 0), 
     STRUCT(off - 1, false)] AS subarray 
    FROM UNNEST([1, 2, 1, 2]) AS cd WITH OFFSET off) 
SELECT 
    cd, 
    ANY_VALUE(subarray) AS subarray 
FROM T 
GROUP BY cd; 

ANY_VALUEは、の値を返します。グループごとに代わりに配列を連結する場合は、ARRAY_CONCAT_AGGを使用できます。 "ANY ARRAY" の同等
このソリューション - これはあなたが結果を期待できます

SELECT cd, subarray 
FROM (
    SELECT cd, subarray, 
    ROW_NUMBER() OVER(PARTITION BY cd) AS num 
    FROM `magicalfairy.land` 
) WHERE num = 1 

(BigQueryの標準SQL)以下試してみてください

SELECT 
    cd, 
    ANY_VALUE(subarray) AS subarray 
FROM `magicalfairy.land` 
GROUP BY cd 
+0

グループに一致する最初の配列の値のセットだけが必要です(他の配列は捨てられます) – CasualT

+0

それは 'ANY_VALUE'がすることです:https://cloud.google.com/bigquery/sql-reference/functions-and-operators#any_value。グループの "最初の"値の概念はないので、レガシーSQLの 'FIRST'集約関数は誤解を招くことに注意してください。 –

+0

配列のセットについては、最初の配列の全体が必要です。 – CasualT

1

下にしてみてください - あなたのテーブルに対してこれを実行するための

OVER()句にORDER BY sort_colを追加することで "FIRST ARRAY"に拡張することができます - sort_colが論理的順序を定義すると仮定して

+0

に対してクールでトリッキーなクエリを追加しました。 :D – CasualT

+0

あなたが好きなら、あなたはそれに投票できます:o) –

関連する問題