BigQuery: альтернатива NEST в стандартном SQL - PullRequest
0 голосов
/ 29 октября 2018

Что является альтернативой функции NEST в стандартном SQL.Я попытался ARRAY_AGG, как упоминалось здесь , но ARRAY_AGG возвращает одну строку, тогда как NEST возвращает плоский массив.

Устаревший SQL: NEST Legacy SQL NEST

Стандартный SQL: ARRAY_AGG ARRAY_AGG Standard SQL

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Ниже для BigQuery:

ARRAY_AGG () в стандартном SQL фактически эквивалентно из NEST () в устаревшем SQL
Они оба возвращают массив элементов в одну строку

Разница заключается в том, как пользовательский интерфейс отображает повторяющиеся поля результатов - для устаревшего пользовательского интерфейса SQL сглаживает результат, и поэтому вы видите его как "плоский массив"

Вы можете проверить его, запустив ниже

#legacySQL  
SELECT COUNT(1) rows FROM (
  SELECT NEST(x) y
  FROM (SELECT 1 AS x),
    (SELECT 2 AS x),
    (SELECT 3 AS x),
    (SELECT 4 AS x),
    (SELECT 5 AS x)
)

с результатом

Row rows     
1   1    

Имейте в виду - такое выравнивание в пользовательском интерфейсе происходит только для большинства внешних операторов выбора, и все внутренние выборки обрабатывают NEST как ARRAYS / повторяющиеся поля

Что касается сохранения результата в таблицу - если вы хотите сохранить вывод ниже как повторяющееся поле

#legacySQL  
SELECT NEST(x) y
FROM (SELECT 1 AS x),
  (SELECT 2 AS x),
  (SELECT 3 AS x),
  (SELECT 4 AS x),
  (SELECT 5 AS x)

, вам необходимо убедиться, что вы отключили Flatten Results, для которого вам также нужно Allow Large Results

0 голосов
/ 29 октября 2018

Я немного удивлен, но этот запрос:

select *
from (select 1 as x),
     (select 2 as x),
     (select 3 as x),
     (select 4 as x),
     (select 5 as x)

Возвращает точно так же, как этот запрос:

select *
from (select 1 as x),
     (select 2 as x),
     (select 3 as x),
     (select 4 as x),
     (select 5 as x);

Проблема, без сомнения, в отсутствии group by. Итак, я думаю, что простой select * будет делать то, что вы хотите:

select *
from (select 1 as x union all select 2 union all select 3 union all select 4 union all select 5
     ) n
...