BigQuery вычитает элементы в массиве - PullRequest
0 голосов
/ 10 апреля 2020

Мне было интересно, как я могу вычислить разницу между элементами в массивах, которые имеют только два элемента, вычитая меньшее из большего.

Я начал со ссылки на пример кода из документации BQ (https://cloud.google.com/bigquery/docs/reference/standard-sql/arrays#arrays_and_aggregation) с несколькими собственными настройками, чтобы оставить только 2 элемента в массивах. Я знаю, что этот пример для СУММ, но мне было интересно, есть ли способ изменить его для расчета различий.

WITH sequences AS
  (SELECT [0, 5] AS some_numbers
   UNION ALL SELECT [2, 32] AS some_numbers
   UNION ALL SELECT [5, 10] AS some_numbers)
SELECT some_numbers,
  (SELECT SUM(x)
   FROM UNNEST(s.some_numbers) x) AS sums
FROM sequences s;

Это мои желаемые результаты.

+--------------------+------+
| some_numbers       | diff |
+--------------------+------+
| [0, 5]             | 5    |
| [2, 32]            | 30   |
| [5, 15]            | 10   |
+--------------------+------+

Ответы [ 3 ]

2 голосов
/ 10 апреля 2020

Ниже для BigQuery Standard SQL

#standardSQL
WITH sequences AS (
  SELECT [0, 5] AS some_numbers UNION ALL 
  SELECT [2, 32] AS some_numbers UNION ALL 
  SELECT [5, 10] AS some_numbers
)
SELECT some_numbers, 
  ABS(some_numbers[OFFSET(0)] - some_numbers[OFFSET(1)]) diff
FROM sequences   

с выводом

enter image description here

1 голос
/ 10 апреля 2020

В качестве альтернативы уже опубликованным ответам для дальнейшего содействия сообществу, я бы предложил использовать Определяемые пользователем функции (UDF) в BigQuery.

Этот ресурс позволяет создавать функции в SQL или JavaScript, которые принимают столбцы ввода и выполняют действия, возвращая желаемый результат после преобразований. Я также добавил бы, что их легко изменить в случае необходимости (например, от суммы до функции вычитания). Вы можете прочитать больше об этом здесь .

Я создал UDF, используя JavaScript, он ниже:

CREATE TEMP FUNCTION
  sub_arr (arr ARRAY<int64>)
  RETURNS int64
  LANGUAGE js AS '''
arr_sub=0
 for(var i = 0; i < arr.length; i++){
    arr_sub = parseInt(arr[i]) - arr_sub ;
  };
  return arr_sub;
''';

#Sample data
WITH
  data AS (
  SELECT [2, 7] AS some_array UNION ALL
  SELECT [10, 32] AS some_array UNION ALL
  SELECT [15,20] AS some_array )

#query using the UDF
SELECT sub_arr(some_array) AS result_diff
FROM data

и вывод

enter image description here

Я хотел бы указать, что вы должны указать тип массива, который вы будете использовать в функции, в данном случае ARRAY<int64>. Кроме того, в соответствии с документацией Javascript UDF не принимает INT64 в качестве типа возврата и преобразуется в FLOAT64, рекомендуется обратить внимание в используемых типах данных.

1 голос
/ 10 апреля 2020

Как насчет только вычитания?

WITH sequences AS (
   SELECT [0, 5] AS some_numbers union all
   SELECT [2, 32] AS some_numbers union all
   SELECT [5, 10] AS some_numbers
   )
select some_numbers,
       some_numbers[ordinal(2)] - some_numbers[ordinal(1)]
from sequences;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...