2014-09-04 2 views
3

У меня есть набор данных, содержащий таблицы с похожими именами таблиц, заканчивающиеся на yyyymmdd. Например:Запрос последней таблицы в наборе данных BigQuery

myproject:mydataset.Sales20140815 
myproject:mydataset.Sales20140816 
myproject:mydataset.Sales20140817 
myproject:mydataset.Sales20140818 
... 
myproject:mydataset.Sales20140903 
myproject:mydataset.Sales20140904 

Есть ли способ, чтобы написать BigQuery запросить последнюю таблицу в наборе данных (для приведенного выше примера является MyProject: mydataset.Sales20140904)?

ответ

2

Только решение я могу думать о вовлекают изменения в вашу повседневную ETL:

A: обновить ETL, чтобы создать копию последней таблицы, как только он был загружен или обновлен. Если вы используете команду Бк инструмент строки, который будет что-то вроде:

bq cp mydataset.Sales20140904 mydataset.SalesLatestDay 

Тогда вы просто запрос к таблице SalesLatestDay.

B: Еще лучше создайте представление, которое ссылается на вашу самую последнюю таблицу («SELECT * FROM mydataset.Sales20140904») и ежедневно обновляйте ее. Информация о создании просмотров с использованием API REST: https://developers.google.com/bigquery/docs/reference/v2/tables#resource

2

Я бы использовал функцию подстановок в таблице. Если последняя сегодняшняя таблица, используйте

Select * from TABLE_DATE_RANG(MyDATASET.,Current_Timestamp(),Current_Timestamp()) 

Если последняя измененная таблица может быть ушедшей даты. Вы можете использовать:

SELECT 
     * 
    FROM 
    TABLE_QUERY(MyDATASET, 
      'table_id CONTAINS "MyTable" 
      AND last_modified_time= (Select MAX(last_modified_time) 
            FROM MyDATASET.__TABLES__ 
            where table_id contains "MyTable")' 
       ) 

Надеется, что это помогает ...

2
SELECT * 
FROM TABLE_QUERY(myproject:mydataset, 
    "table_id IN (
    SELECT table_id FROM myproject:mydataset.__TABLES__ 
    WHERE REGEXP_MATCH(table_id, r"^Sales.*") 
    ORDER BY creation_time DESC LIMIT 1)") 
7

Н.Н. ответ хорош, но полагаться на дату модификации проблематично, если старый набор данных реимпортируется, который ошибочно будет вытягиваться как «последний». Поскольку table_id явно перечисляет даты в правильном порядке, лучше использовать это значение напрямую.

SELECT 
    * 
FROM 
TABLE_QUERY(MyDATASET, 
     'table_id CONTAINS "MyTable" 
     AND table_id= (Select MAX(table_id) 
           FROM MyDATASET.__TABLES__ 
           where table_id contains "MyTable")' 
      ) 
0

Если ваш стол, безусловно, обновляется ежедневно, вот мой трюк.

SELECT * FROM TABLE_DATE_RANGE(myproject:mydataset.Sales, CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP()) 
Смежные вопросы