2012-11-01 16 views
11

Poiché non è possibile aggiornare i dati all'interno di una tabella in BigQuery e supporta solo il meccanismo di aggiunta, ho deciso di creare nuove tabelle su base mensile. Supponiamo quindi che per l'anno 2012 le tabelle siano (tbl_012012, tbl_022012, tbl_032012, ... tbl_122012). Ogni record verrà archiviato insieme alla data timestamp come stringa.Interrogazione di più tabelle in Big Query

Ora, se la mia domanda vuole recuperare record che vanno da gennaio 2012 (tbl_012012) a marzo 2012 (tbl_032012), sarà BigQuery API attraversare automaticamente attraverso i tavoli desiderati tramite interrogazione singola gamma SQL o dovrò scrivere più query SQL con un codice di applicazione aggiuntivo per recuperare ogni risultato di query e quindi aggregarle del tutto?

risposta

12

Una query SQL può fare riferimento a più tabelle. Basta separare ogni tabella con una virgola nella clausola FROM per eseguire una query su tutte le tabelle citate.

+0

Grazie mille per. Ma questo funzionerà in caso di query di intervallo, cosa succede se la mia query cerca un singolo record che può essere ridondante. Quindi in questo caso Big Query attraverserà ovviamente ogni mese per trovare quel record. –

+1

BigQuery è ottimizzato per query aggregate, al contrario di query che cercano un singolo record. Quindi, sì, sfortunatamente in questo caso avresti bisogno di cercare in ogni tabella del mese se stai cercando solo un singolo record che potrebbe essere in uno qualsiasi dei tavoli. –

+0

Grazie per avermi aiutato. –

3

Ecco un frammento che dimostra un esempio della tabella multipla selezionare:

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

È inoltre possibile utilizzare una funzione di tabella jolly. Ecco un esempio dalla docs per StandardSQL:

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

Ed ecco un esempio simile per LegacySQL (docs).

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

Ciò interrogare le tabelle:

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

Ci sono alcune altre opzioni sul docs. Consiglierei di controllarli.

+0

È possibile interrogare anche un intervallo di mesi del modulo '201601'? –

1

2017 aggiornamento:

Con BigQuery #standardSQL - è possibile utilizzare standard di UNION ALL per passare attraverso più tabelle, oppure è possibile utilizzare un * per abbinare tutte le tabelle che condividono lo stesso prefisso. Quando si utilizza il matcher *, si avrà anche accesso alla meta-colonna _TABLE_SUFFIX - per sapere da quale tabella provengono le righe.

SELECT * FROM Roster 
UNION ALL 
SELECT * FROM TeamMascot 
Problemi correlati