2012-11-01 10 views
11

Da es nicht möglich ist, Daten in einer Tabelle in BigQuery zu aktualisieren, und nur Append-Mechanismus unterstützt, habe ich beschlossen, neue Tabellen auf monatlicher Basis zu erstellen. Angenommen, für das Jahr 2012 wären die Tabellen (tbl_012012, tbl_022012, tbl_032012, ... tbl_122012). Jeder Datensatz wird zusammen mit dem Datum timestamp als Zeichenfolge gespeichert.Abfrage mehrerer Tabellen in Big Query

Nun, wenn meine Bewerbung will Aufzeichnungen holen ab Januar 2012 hin (tbl_012012) bis März 2012 (tbl_032012) wird BigQuery API automatisch durch die gewünschten Tabellen über einzelne SQL-Bereich Abfrage durchqueren oder werde ich mehrere SQL-Abfragen schreiben müssen Mit zusätzlichem Anwendungscode, um jedes Abfrageergebnis abzurufen und dann zusammen zu aggregieren?

Antwort

12

Eine SQL-Abfrage kann auf mehrere Tabellen verweisen. Trennen Sie einfach jede Tabelle mit einem Komma in der FROM-Klausel, um alle genannten Tabellen abzufragen.

+0

Vielen Dank für. Dies funktioniert jedoch bei Bereichsabfragen, wenn meine Abfrage nach einem einzelnen Datensatz sucht, der redundant sein kann. In diesem Fall wird Big Query also offensichtlich jeden Monat durchqueren, um diesen Datensatz zu finden. –

+1

BigQuery ist für Sammelanfragen optimiert, im Gegensatz zu Abfragen, die nach einem einzelnen Datensatz suchen. Also, ja, in diesem Fall müssten Sie leider jede Monatentabelle durchsuchen, wenn Sie nur einen einzigen Datensatz suchen, der in einer der Tabellen enthalten sein könnte. –

+0

Danke, dass Sie mir geholfen haben. –

3

Hier ist ein Ausschnitt ein Beispiel für die mehrere Tabellen demonstriert wählen:

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

Sie auch eine Tabelle Wildcard-Funktion verwenden können. Hier ist ein Beispiel aus dem docs für StandardSQL:

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

Und hier ist ein ähnliches Beispiel für LegacySQL (docs).

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

Dadurch werden die Tabellen abfragen:

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

Es gibt ein paar andere Optionen auf dem docs. Ich würde empfehlen, sie zu überprüfen.

+0

Kann man auch einen Monatsbereich der Form '201601' abfragen? –

1

2017 Update:

Mit BigQuery #standardSQL - Sie können entweder Standard UNION ALL können Sie durch mehrere Tabellen gehen, oder Sie können ein * verwenden, um alle Tabellen übereinstimmen, die den gleichen Präfix teilen. Wenn Sie den * Matcher verwenden, haben Sie auch Zugriff auf die Meta-Spalte _TABLE_SUFFIX - um zu wissen, aus welcher Tabelle die Zeilen stammen.

SELECT * FROM Roster 
UNION ALL 
SELECT * FROM TeamMascot