2012-11-01 4 views
11

Ponieważ nie jest możliwa aktualizacja danych w tabeli w BigQuery i obsługiwany jest tylko mechanizm dołączania, zdecydowałem się tworzyć nowe tabele miesięcznie. Załóżmy, że dla roku 2012 tabele będą (tbl_012012, tbl_022012, , ... tbl_122012). Każdy rekord będzie przechowywany wraz z datą timestamp jako ciąg.Wywoływanie wielu tabel w Big Query

Teraz, jeśli moja aplikacja chce pobrać zapisy od stycznia 2012 (tbl_012012) do marca 2012 (tbl_032012), czy interfejs BigQuery API będzie automatycznie przechodzić przez żądane tabele za pomocą pojedynczego zapytania SQL lub czy będę musiał napisać wiele zapytań SQL z dodatkowym kodem aplikacji, aby pobrać każdy wynik zapytania, a następnie zagregować je w całości?

Odpowiedz

12

Jedno zapytanie SQL może odwoływać się do wielu tabel. Po prostu oddziel każdą tabelę przecinkiem w klauzuli FROM, aby uzyskać zapytanie dotyczące wszystkich wymienionych tabel.

+0

Wielkie dzięki. Ale to będzie działać w przypadku zapytań o zakres, co jeśli moje zapytanie wyszuka jeden rekord, który może być nadmiarowy. Tak więc w tym przypadku Big Query będzie oczywiście przechodzić przez każdy miesięczny stół, aby znaleźć ten rekord. –

+1

BigQuery jest zoptymalizowany pod kątem zapytań zbiorczych, w przeciwieństwie do zapytań, które szukają pojedynczego rekordu. Tak, tak, niestety w tym przypadku musisz przeszukać tabelę każdego miesiąca, jeśli szukasz tylko jednego rekordu, który może znajdować się w dowolnej z tabel. –

+0

Dzięki za pomoc. –

3

Oto urywek demonstrując przykładową tabelą wielokrotnego wyboru:

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 
31

Można również użyć funkcji Tabela wieloznacznych. Oto jeden z przykładów z docs dla StandardSQL:

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

A oto podobny przykład dla LegacySQL (docs).

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

Ten wyśle ​​zapytanie tabele:

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

Istnieje kilka innych opcji na docs. Zaleciłbym sprawdzenie ich.

+0

Czy można również zapytać o zakres miesiąca w formie "201601"? –

1

2017 aktualizacja:

Dzięki BigQuery #standardSQL - można użyć standardowego UNION ALL przejść przez wielu tabel, można też użyć * dopasować wszystkie tabele, które dzielą ten sam prefiks. Podczas korzystania z macierzy * będziesz mieć również dostęp do meta-kolumny _TABLE_SUFFIX - aby dowiedzieć się, z której tabeli pochodzą wiersze.

SELECT * FROM Roster 
UNION ALL 
SELECT * FROM TeamMascot