Есть ли способ сделать подстановочный знак с GROUP BY в bigquery? - PullRequest
0 голосов
/ 04 февраля 2019

Предположим, у меня есть две таблицы: tbl_a содержит поле id "id" и целый ряд других полей "fa", "fb", ... "fz".(со всеми уникальными идентификаторами)

tbl_b содержит два поля «id» и «value» - где может быть несколько значений для одного и того же идентификатора.Я хочу сделать таблицу с теми же полями, что и в tbl_a, но с дополнительным полем, дающим среднее значение.Это можно сделать следующим образом:

SELECT
tbl_a.id AS id
ANY_VALUE(tbl_a.fa) AS fa
...
ANY_VALUE(tbl_a.fz) AS fz
AVG(tbl_b.value) AS avg_value
FROM
tbl_a JOIN tbl_b ON tbl_a.id AS tbl_b.id
GROUP BY tbl_a.id

Мой вопрос:

Есть ли способ написать этот запрос без необходимости явно писать в каждом поле, из которого вы хотите передатьот старой к новой таблице?

Если бы не было GROUP BY, то это можно было бы сделать с помощью подстановочного знака, но я не вижу, как это сделать там, где есть GROUP BY, так как подстановочный знакфактически должно быть в пределах ANY_VALUE ().

1 Ответ

0 голосов
/ 04 февраля 2019

Ниже для BigQuery Standard SQL

#standardSQL
SELECT ANY_VALUE(a).*, AVG(value) avg_value
FROM `project.dataset.table_a` a
LEFT JOIN `project.dataset.table_b` b
USING(id)
GROUP BY a.id

Вы можете протестировать, поиграть с выше, используя фиктивные данные, как в примере ниже

#standardSQL
WITH `project.dataset.table_a` AS (
  SELECT 1 id, 11 fa, 12 fb, 13 fc UNION ALL
  SELECT 2, 21, 22, 23 UNION ALL
  SELECT 3, 31, 32, 33
), `project.dataset.table_b` AS (
  SELECT 1 id, 1 value UNION ALL
  SELECT 1, 2 UNION ALL
  SELECT 1, 3 UNION ALL
  SELECT 2, 4 UNION ALL
  SELECT 2, 5 UNION ALL
  SELECT 2, 6 UNION ALL
  SELECT 3, 7 
)
SELECT ANY_VALUE(a).*, AVG(value) avg_value
FROM `project.dataset.table_a` a
LEFT JOIN `project.dataset.table_b` b
USING(id)
GROUP BY a.id
-- ORDER BY a.id

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

Row id  fa  fb  fc  avg_value    
1   1   11  12  13  2.0  
2   2   21  22  23  5.0  
3   3   31  32  33  7.0  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...