Запрос нескольких таблиц в Big Query

Так как невозможно обновить данные в таблице в BigQuery и поддерживает только механизм добавления, я решил ежемесячно создавать новые таблицы. Предположим, что в 2012 году таблицы будут (tbl_012012, tbl_022012, tbl_032012,... tbl_122012). Каждая запись будет сохранена вместе с датой timestamp как строка.

Теперь, если мое приложение хочет получать записи, начиная с января 2012 года (tbl_012012) до марта 2012 года (tbl_032012), BigQuery API автоматически пройдет через нужные таблицы с помощью запроса на один SQL-диапазон или мне придется писать несколько SQL-запросов с дополнительным кодом приложения для извлечения каждого результата запроса и их суммирования в целом?

Ответ 1

Один SQL-запрос может ссылаться на несколько таблиц. Просто отделите каждую таблицу запятой в предложении FROM, чтобы запросить все упомянутые таблицы.

Ответ 2

Вы также можете использовать функцию подстановочного стола. Здесь один пример из docs для StandardSQL:

SELECT 
  name
FROM 
  mydata.people
WHERE 
  age >= 35
  AND
  (_TABLE_SUFFIX BETWEEN '20140325' AND '20140327')

И вот аналогичный пример для LegacySQL (docs).

SELECT 
  name
FROM 
  (TABLE_DATE_RANGE([mydata.people], 
                TIMESTAMP('2014-03-25'), 
                TIMESTAMP('2014-03-27'))) 
WHERE 
  age >= 35

Это запросит таблицы:

  • mydata.people20140325
  • mydata.people20140326
  • mydata.people20140327

На docs имеется еще несколько опций. Я бы рекомендовал проверить их.

Ответ 3

Вот фрагмент, демонстрирующий пример множественного выбора таблицы:

SELECT trafficSource.medium AS Traffic_Source, COUNT(trafficSource.medium) AS Counts_Source
FROM [608XXXXX.ga_sessions_20131008],
[608XXXXX.ga_sessions_20131009],
[608XXXXX.ga_sessions_20131010],
[608XXXXX.ga_sessions_20131011],
[608XXXXX.ga_sessions_20131012],
[608XXXXX.ga_sessions_20131013],
[608XXXXX.ga_sessions_20131014],
[608XXXXX.ga_sessions_20131015],
GROUP BY Traffic_Source
ORDER BY Counts_Source DESC

Ответ 4

2017 обновление:

С BigQuery #standardSQL вы можете использовать стандартный UNION ALL для перехода через несколько таблиц, или вы можете использовать * для соответствия всем таблицам, которые используют один и тот же префикс. При использовании сочетания * у вас также будет доступ к мета-столбцу _TABLE_SUFFIX, чтобы узнать, из какой таблицы были получены строки.

SELECT * FROM Roster
UNION ALL
SELECT * FROM TeamMascot