2016-08-18 5 views
0

Я использую LegacySQL, но не строго ограничиваю его. (хотя у него есть некоторые методы, которые я нахожу полезными, например, «HASH»).BigQuery: выберите полное повторяющееся поле с группой

Как бы то ни было, простой задачей является то, что я хочу группировать один столбец верхнего уровня, сохраняя при этом первый экземпляр вложенного + повторного набора данных.

Таким образом, следующее «работает», а также производит вложенную вывод:

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

что вы ожидаете получить в результате второго (в своем вопросе) запроса? что «неправильно» с первым? пожалуйста, уточните, поскольку неясно, чего вы ожидаете. –

+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 вернет некоторое значение subarray для каждой группы. Если вы захотите объединить массивы вместо этого, вы можете использовать ARRAY_CONCAT_AGG.

выполнить команду на вашем столе - попробуйте ниже

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.Обратите внимание, что агрегированная функция 'FIRST' в устаревшем SQL вводит в заблуждение, так как нет понятия« первого »значения для группы. –

+0

Для набора массивов я хочу весь массив первого массива. – CasualT

1

Try ниже (BigQuery Standard SQL)

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

Это дает ожидаемый результат - эквивалент "ЛЮБОЙ ARRAY"
Это решение может быть расширена до «ПЕРВАЯ МАССА», добавив ORDER BY sort_col в предложение OVER() - при условии, что sort_col определяет логический порядок

+0

, которая является одновременно и классной, и сложной. : D – CasualT

+0

вы можете проголосовать по нему, если вам это нравится: o) –

Смежные вопросы