Google Big Query: оконная функция, совокупная сумма строк по столбцам

Я хочу рассчитать совокупную сумму по столбцам в Google Big Query.

Предположим, что есть пять столбцов (NAME,A,B,C,D) с двумя строками целых чисел, например:

 NAME | A | B | C | D
----------------------
 Bob  | 1 | 2 | 3 | 4
 Carl | 5 | 6 | 7 | 8

Я ищу оконную функцию или UDF для вычисления совокупной суммы по строкам для создания этого вывода:

 NAME | A | B  | C  | D
-------------------------
 Bob  | 1 | 3  | 6  | 10
 Carl | 5 | 11 | 18 | 27

Любые мысли или предложения с благодарностью!


person echoecho256    schedule 08.01.2016    source источник
comment
У вас низкая ставка. Важно для SO, вы должны отметить принятые ответы, поставив галочку слева от опубликованного ответа под голосованием. Это повысит вашу ставку. Посмотрите, как это работает, перейдя по этой ссылке: meta.stackoverflow.com/questions/5234/   -  person Pentium10    schedule 08.01.2016


Ответы (2)


Я думаю, что есть ряд разумных обходных путей для ваших требований, в основном в области улучшения дизайна вашей таблицы. Все действительно зависит от того, как вы вводите свои данные и, самое главное, как вы их потребляете.

Тем не менее, если придерживаться представленных требований. Ниже приведено не совсем то, что вы ожидаете в своем вопросе в качестве вывода, но может быть полезно в качестве примера:

SELECT name, GROUP_CONCAT(STRING(cum)) AS all FROM (
  SELECT name, 
    SUM(INTEGER(num)) 
    OVER(PARTITION BY name 
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cum
  FROM (
    SELECT name, SPLIT(all) AS num FROM (
      SELECT name, 
         CONCAT(STRING(a),',',STRING(b),',',STRING(c),',',STRING(d)) AS all 
      FROM yourtable
    )
  )
)
GROUP BY name

Выход:

name    all  
Bob     1,3,6,10     
Carl    5,11,18,26   

Зависит от того, как вы используете эти данные - они все еще могут работать на вас. Обратите внимание, что вы не избегаете сейчас писать что-то вроде col1 + col2 + .. + col89 + col90 - но все равно нужно явно указывать каждый столбец только один.

в случае, если у вас есть «роскошь» реализации ваших требований за пределами пользовательского интерфейса GBQ, а скорее в каком-то клиенте — вы можете использовать BigQuery API для программного получения схемы таблицы и построения на лету свою логику/запрос, а затем выполните его. Для начала взгляните на приведенные ниже API:
Чтобы получить схему таблицы, https://cloud.google.com/bigquery/docs/reference/v2/tables/get
Чтобы выполнить задание запроса - https://cloud.google.com/bigquery/docs/reference/v2/jobs/insert

person Mikhail Berlyant    schedule 08.01.2016

Нет необходимости в UDF:

SELECT name, a, a+b, a+b+c, a+b+c+d
FROM tab
person dnoeth    schedule 08.01.2016
comment
Спасибо за ваш ответ. Это определенно работает с четырьмя столбцами, но было бы проблематично, скажем, с 90 столбцами. - person echoecho256; 08.01.2016
comment
SQL должен быть написан или сгенерирован с использованием некоторого сценария, имена столбцов должны быть явно записаны в запросе. - person Pentium10; 08.01.2016
comment
@echoecho256: Когда у вас есть столбцы 90, вы не должны писать 4. Но в любом случае Windowing Functions работают со строками, а не со столбцами, и UDF будет вызываться 90 раз с разными параметрами, или вам нужно будет создать 90 разных UDF. Кстати, выглядит как денормализованная таблица, если вам нужно сделать такой расчет... - person dnoeth; 08.01.2016
comment
@dnoeth Еще раз спасибо, в следующий раз я обязательно включу более подробную информацию о количестве столбцов. - person echoecho256; 08.01.2016