Sintassi, funzioni e operatori SQL precedenti
Questo documento descrive la sintassi, le funzioni e gli operatori delle query SQL precedente. La sintassi delle query preferita per BigQuery è la sintassi GoogleSQL. Per ulteriori informazioni, consulta la sezione Disponibilità delle funzionalità di SQL precedente.
Sintassi delle query
Nota:le parole chiave non fanno distinzione tra maiuscole e minuscole. In questo documento, le parole chiave come
SELECT sono scritte in maiuscolo a scopo illustrativo.
Clausola SELECT
La clausola SELECT specifica un elenco di espressioni da calcolare. Le espressioni nella clausola SELECT possono contenere nomi di campi, valori letterali e chiamate di funzioni (incluse funzioni di aggregazione e funzioni finestra), nonché combinazioni dei tre. L'elenco
di espressioni è separato da virgole.
A ogni espressione può essere assegnato un alias aggiungendo uno spazio seguito da un identificatore dopo l'espressione. La parola chiave facoltativa AS può essere aggiunta tra l'espressione e l'alias
per una migliore leggibilità. È possibile fare riferimento agli alias definiti in una clausola SELECT nelle clausole GROUP BY, HAVING e ORDER BY della query, ma non nelle clausole FROM, WHERE o OMIT RECORD IF né in altre espressioni della stessa clausola SELECT.
Note:
-
Se utilizzi una funzione di aggregazione nella clausola
SELECT, devi utilizzare una funzione di aggregazione in tutte le espressioni oppure la query deve avere una clausolaGROUP BYche includa tutti i campi non aggregati nella clausolaSELECTcome chiavi di raggruppamento. Ad esempio:#legacySQL SELECT word, corpus, COUNT(word) FROM [bigquery-public-data:samples.shakespeare] WHERE word CONTAINS "th" GROUP BY word, corpus; /* Succeeds because all non-aggregated fields are group keys. */
#legacySQL SELECT word, corpus, COUNT(word) FROM [bigquery-public-data:samples.shakespeare] WHERE word CONTAINS "th" GROUP BY word; /* Fails because corpus is not aggregated nor is it a group key. */
-
Puoi utilizzare le parentesi quadre per eseguire l'escape delle
parole riservate
in modo da poterle utilizzare come nome del campo e alias. Ad esempio, se hai una colonna denominata
"partition", che è una parola riservata nella sintassi BigQuery, le query che fanno riferimento
a questo campo non vengono eseguite e vengono visualizzati messaggi di errore oscuri, a meno che non venga eseguito l'escape con parentesi quadre:
SELECT [partition] FROM ...
Esempio
Questo esempio definisce gli alias nella clausola SELECT e poi fa riferimento a uno di questi nella clausola ORDER BY. Tieni presente che non è possibile fare riferimento alla colonna word utilizzando
word_alias nella clausola WHERE; è necessario fare riferimento alla colonna per nome. Anche l'alias len non è visibile nella clausola WHERE. Sarebbe visibile a una
clausola HAVING.
#legacySQL SELECT word AS word_alias, LENGTH(word) AS len FROM [bigquery-public-data:samples.shakespeare] WHERE word CONTAINS 'th' ORDER BY len;
Modificatore WITHIN per le funzioni aggregate
aggregate_function WITHIN RECORD [ [ AS ] alias ]
La parola chiave WITHIN fa sì che la funzione di aggregazione aggreghi i valori ripetuti
all'interno di ogni record. Per ogni record di input, verrà prodotto esattamente un output aggregato. Questo
tipo di aggregazione è chiamato aggregazione con ambito. Poiché l'aggregazione con ambito
produce un output per ogni record, le espressioni non aggregate possono essere selezionate insieme
a quelle aggregate con ambito senza utilizzare una clausola GROUP BY.
In genere, quando utilizzi l'aggregazione con ambito, utilizzi l'ambito RECORD. Se hai uno schema nidificato e ripetuto molto complesso, potresti dover eseguire aggregazioni all'interno di ambiti di sottorecord. A questo scopo, sostituisci la parola chiave RECORD nella sintassi
sopra con il nome del nodo nello schema in cui vuoi che venga eseguita l'aggregazione.
Per saperne di più su questo comportamento avanzato, vedi
Gestione dei dati.
Esempio
Questo esempio esegue un'aggregazione COUNT con ambito e poi filtra e ordina i record in base al valore aggregato.
#legacySQL SELECT repository.url, COUNT(payload.pages.page_name) WITHIN RECORD AS page_count FROM [bigquery-public-data:samples.github_nested] HAVING page_count > 80 ORDER BY page_count DESC;
Clausola FROM
FROM [project_name:]datasetId.tableId [ [ AS ] alias ] | (subquery) [ [ AS ] alias ] |JOINclause |FLATTENclause | table wildcard function
La clausola FROM specifica i dati di origine da interrogare. Le query BigQuery
possono essere eseguite direttamente su tabelle, su sottoquery, su tabelle unite e su tabelle modificate da
operatori speciali descritti di seguito. Le combinazioni di queste origini dati possono essere interrogate utilizzando
la virgola, che è l'operatore UNION ALL in
BigQuery.
Riferimenti alle tabelle
Quando fai riferimento a una tabella, devono essere specificati sia datasetId sia tableId; project_name è facoltativo. Se project_name non è specificato, BigQuery utilizza per impostazione predefinita il progetto corrente. Se il nome del progetto include un trattino, devi racchiudere l'intero riferimento alla tabella tra parentesi.
Esempio
[my-dashed-project:dataset1.tableName]
Alle tabelle può essere assegnato un alias aggiungendo uno spazio seguito da un identificatore dopo il nome della tabella. La
parola chiave facoltativa AS può essere aggiunta tra tableId e l'alias per
una migliore leggibilità.
Quando fai riferimento alle colonne di una tabella, puoi utilizzare il nome semplice della colonna o puoi aggiungere un prefisso al nome della colonna con l'alias, se ne hai specificato uno, oppure con datasetId e tableId, a condizione che non sia stato specificato alcun project_name. Il project_name non può essere incluso nel prefisso della colonna perché il carattere due punti non è consentito nei nomi dei campi.
Esempi
Questo esempio fa riferimento a una colonna senza prefisso di tabella.
#legacySQL SELECT word FROM [bigquery-public-data:samples.shakespeare];
Questo esempio antepone al nome della colonna datasetId e tableId. Tieni presente che project_name non può essere incluso in questo esempio. Questo metodo funziona solo se il set di dati si trova nel progetto predefinito corrente.
#legacySQL SELECT samples.shakespeare.word FROM samples.shakespeare;
Questo esempio antepone al nome della colonna un alias della tabella.
#legacySQL SELECT t.word FROM [bigquery-public-data:samples.shakespeare] AS t;
Tabelle partizionate con intervallo di numeri interi
SQL legacy supporta l'utilizzo di decorator di tabella per indirizzare una partizione specifica in una tabella partizionata per intervallo di numeri interi. La chiave per indirizzare una partizione di intervallo è l'inizio dell'intervallo.
Il seguente esempio esegue una query sulla partizione di intervallo che inizia con 30:
#legacySQL SELECT * FROM dataset.table$30;
Tieni presente che non puoi utilizzare SQL precedente per eseguire query su un'intera tabella partizionata in base a un intervallo di numeri interi. La query restituisce invece un errore simile al seguente:
Querying tables partitioned on a field is not supported in Legacy SQL
Utilizzo delle sottoquery
Una query secondaria è un'istruzione SELECT nidificata racchiusa tra parentesi. Le espressioni calcolate nella clausola SELECT della sottoquery sono disponibili per la query esterna proprio come le colonne di una tabella.
Le sottoquery possono essere utilizzate per calcolare aggregazioni e altre espressioni. L'intera gamma di operatori SQL è disponibile nella sottoquery. Ciò significa che una sottoquery può contenere altre sottoquery, può eseguire join e aggregazioni di raggruppamento e così via.
Virgola come UNION ALL
A differenza di GoogleSQL, SQL precedente utilizza la virgola come operatore UNION ALL anziché come operatore CROSS JOIN. Si tratta di un comportamento legacy che si è evoluto perché
storicamente BigQuery non supportava CROSS JOIN e gli utenti di BigQuery avevano regolarmente bisogno di scrivere
query UNION ALL. In GoogleSQL, le query che eseguono unioni sono particolarmente
verbose. L'utilizzo della virgola come operatore di unione consente di scrivere queste query in modo molto più efficiente. Ad esempio, questa query può essere utilizzata per eseguire una singola query sui log di più giorni.
#legacySQL SELECT FORMAT_UTC_USEC(event.timestamp_in_usec) AS time, request_url FROM [applogs.events_20120501], [applogs.events_20120502], [applogs.events_20120503] WHERE event.username = 'root' AND NOT event.source_ip.is_internal;
Le query che uniscono un numero elevato di tabelle in genere vengono eseguite più lentamente rispetto a quelle che elaborano la stessa quantità di dati da una singola tabella. La differenza di rendimento può arrivare fino a 50 ms per tabella aggiuntiva. Una singola query può unire al massimo 1000 tabelle.
Funzioni con caratteri jolly nelle tabelle
Il termine funzione jolly tabella si riferisce a un tipo speciale di funzione univoca per BigQuery.
Queste funzioni vengono utilizzate nella clausola FROM per trovare una corrispondenza con una raccolta di nomi di tabelle
utilizzando uno dei diversi tipi di filtri. Ad esempio, la funzione TABLE_DATE_RANGE
può essere utilizzata per eseguire query solo su un insieme specifico di tabelle giornaliere. Per saperne di più su queste funzioni,
consulta Funzioni jolly per le tabelle.
Operatore FLATTEN
(FLATTEN([project_name:]datasetId.tableId, field_to_be_flattened)) (FLATTEN((subquery), field_to_be_flattened))
A differenza dei tipici sistemi di elaborazione SQL, BigQuery è progettato per gestire dati ripetuti. Per questo motivo, gli utenti di BigQuery a volte devono scrivere query che manipolano la struttura dei record ripetuti. Un modo per farlo è utilizzare l'operatore FLATTEN.
FLATTEN converte un nodo dello schema da ripetuto a facoltativo. Dato un record
con uno o più valori per un campo ripetuto, FLATTEN creerà più record,
uno per ogni valore nel campo ripetuto. Tutti gli altri campi selezionati dal record vengono duplicati
in ogni nuovo record di output. FLATTEN può essere applicato ripetutamente per rimuovere
più livelli di ripetizione.
Per ulteriori informazioni ed esempi, consulta la sezione Gestione dei dati.
Operatore JOIN
BigQuery supporta più operatori JOIN in ogni clausola FROM.
Le operazioni JOIN successive utilizzano i risultati dell'operazione JOIN precedente
come input JOIN a sinistra. I campi di qualsiasi input JOIN precedente
possono essere utilizzati come chiavi nelle clausole ON degli operatori JOIN successivi.
Tipi JOIN
BigQuery supporta le operazioni INNER, [FULL|RIGHT|LEFT] OUTER e
CROSS JOIN. Se non specificato, il valore predefinito è INNER.
Le operazioni CROSS JOIN non consentono le clausole ON. CROSS JOIN
può restituire una grande quantità di dati e potrebbe comportare una query lenta e inefficiente o una query
che supera le risorse massime consentite per query. Queste query non andranno a buon fine e restituiranno un errore. Se
possibile, preferisci le query che non utilizzano CROSS JOIN. Ad esempio, CROSS JOIN
viene spesso utilizzato in contesti in cui le funzioni finestra sarebbero
più efficienti.
Modificatore EACH
Il modificatore EACH è un suggerimento che indica a BigQuery di eseguire JOIN
utilizzando più partizioni. Questa opzione è particolarmente utile quando sai che entrambi i lati di JOIN sono grandi. Il modificatore EACH non può essere utilizzato nelle clausole CROSS JOIN.
EACH era incoraggiato in molti casi, ma non è più così. Se
possibile, utilizza JOIN senza il modificatore EACH per un rendimento migliore.
Utilizza JOIN EACH quando la query non è andata a buon fine e viene visualizzato un messaggio di errore relativo al superamento delle risorse.
Semi-join e Anti-join
Oltre a supportare JOIN nella clausola FROM, BigQuery supporta anche due tipi di join nella clausola WHERE: semi-join e anti-semi-join. Un
semi-join viene specificato utilizzando la parola chiave IN con una sottoquery; l'anti-join, utilizzando le
parole chiave NOT IN.
Esempi
La seguente query utilizza un semi-join per trovare n-grammi in cui la prima parola dell'n-gramma è anche la seconda parola di un altro n-gramma che ha "AND" come terza parola dell'n-gramma.
#legacySQL SELECT ngram FROM [bigquery-public-data:samples.trigrams] WHERE first IN (SELECT second FROM [bigquery-public-data:samples.trigrams] WHERE third = "AND") LIMIT 10;
La seguente query utilizza un semi-join per restituire il numero di donne di età superiore a 50 anni che hanno partorito nei 10 stati con il maggior numero di nascite.
#legacySQL SELECT mother_age, COUNT(mother_age) total FROM [bigquery-public-data:samples.natality] WHERE state IN (SELECT state FROM (SELECT state, COUNT(state) total FROM [bigquery-public-data:samples.natality] GROUP BY state ORDER BY total DESC LIMIT 10)) AND mother_age > 50 GROUP BY mother_age ORDER BY mother_age DESC
Per visualizzare i numeri degli altri 40 stati, puoi utilizzare un anti-join. La query seguente è
quasi identica all'esempio precedente, ma utilizza NOT IN anziché IN
per restituire il numero di donne di età superiore a 50 anni che hanno partorito nei 40 stati con il minor numero di nascite.
#legacySQL SELECT mother_age, COUNT(mother_age) total FROM [bigquery-public-data:samples.natality] WHERE state NOT IN (SELECT state FROM (SELECT state, COUNT(state) total FROM [bigquery-public-data:samples.natality] GROUP BY state ORDER BY total DESC LIMIT 10)) AND mother_age > 50 GROUP BY mother_age ORDER BY mother_age DESC
Note:
- BigQuery non supporta i semi-join o gli anti-semi-join correlati. La sottoquery non può fare riferimento a campi della query esterna.
- La sottoquery utilizzata in un semi-join o anti-semi-join deve selezionare esattamente un campo.
-
I tipi del campo selezionato e del campo utilizzato dalla query esterna nella clausola
WHEREdevono corrispondere esattamente. BigQuery non eseguirà alcun tipo di coercizione per i semi-join o gli anti-semi-join.
Clausola WHERE
La clausola WHERE, a volte chiamata predicato, filtra i record prodotti dalla clausola FROM utilizzando un'espressione booleana. Più condizioni possono essere unite da clausole booleane
AND e OR, facoltativamente racchiuse tra parentesi ()
per raggrupparle. I campi elencati in una clausola WHERE non devono essere selezionati nella
clausola SELECT corrispondente e l'espressione della clausola WHERE non può
fare riferimento a espressioni calcolate nella clausola SELECT della query a cui
appartiene la clausola WHERE.
Nota:le funzioni di aggregazione non possono essere utilizzate nella clausola WHERE. Utilizza una
clausola HAVING e una query esterna se devi filtrare l'output di una funzione di aggregazione.
Esempio
Il seguente esempio utilizza una disgiunzione di espressioni booleane nella clausola WHERE: le due espressioni sono unite da un operatore OR. Un record di input passerà
attraverso il filtro WHERE se una delle espressioni restituisce true.
#legacySQL SELECT word FROM [bigquery-public-data:samples.shakespeare] WHERE (word CONTAINS 'prais' AND word CONTAINS 'ing') OR (word CONTAINS 'laugh' AND word CONTAINS 'ed');
Clausola OMIT RECORD IF
La clausola OMIT RECORD IF è un costrutto univoco di BigQuery. È
particolarmente utile per gestire schemi nidificati e ripetuti. È simile a una clausola WHERE
, ma diversa per due aspetti importanti. Innanzitutto, utilizza una condizione di esclusione,
il che significa che i record vengono omessi se l'espressione restituisce true, ma conservati se
l'espressione restituisce false o null. In secondo luogo, la clausola OMIT RECORD IF
può (e di solito lo fa) utilizzare funzioni di aggregazione con ambito nella sua condizione.
Oltre a filtrare i record completi, OMIT...IF può specificare un ambito più ristretto
per filtrare solo parti di un record. A questo scopo, utilizza il nome di un nodo non foglia nello schema anziché RECORD nella clausola OMIT...IF. Questa funzionalità
viene utilizzata raramente dagli utenti di BigQuery. Puoi trovare ulteriore documentazione su questo comportamento avanzato
collegata alla documentazione WITHIN riportata sopra.
Se utilizzi OMIT...IF
per escludere una parte di un record in un campo ripetuto e la query seleziona anche altri campi ripetuti in modo indipendente, BigQuery omette una parte degli altri record ripetuti nella query. Se visualizzi l'errore
Cannot perform OMIT IF on repeated scope <scope> with independently repeating pass through field <field>,
ti consigliamo di passare a GoogleSQL. Per informazioni sulla migrazione delle istruzioni OMIT...IF a GoogleSQL, consulta Migrazione a GoogleSQL.
Esempio
Tornando all'esempio utilizzato per il modificatore WITHIN, OMIT RECORD IF
può essere utilizzato per ottenere lo stesso risultato che WITHIN e HAVING
ottenevano in quell'esempio.
#legacySQL SELECT repository.url FROM [bigquery-public-data:samples.github_nested] OMIT RECORD IF COUNT(payload.pages.page_name) <= 80;
Clausola GROUP BY
La clausola GROUP BY consente di raggruppare le righe che hanno gli stessi valori per un determinato campo o insieme di campi, in modo da poter calcolare le aggregazioni dei campi correlati. Il raggruppamento avviene
dopo il filtraggio eseguito nella clausola WHERE, ma prima che vengano calcolate le espressioni nella
clausola SELECT. I risultati dell'espressione non possono essere utilizzati come chiavi di gruppo nella clausola GROUP BY.
Esempio
Questa query trova le dieci prime parole più comuni nel set di dati di esempio dei trigrammi.
Oltre a mostrare l'utilizzo della clausola GROUP BY, viene illustrato come
gli indici posizionali possono essere utilizzati al posto dei nomi dei campi nelle clausole GROUP BY e
ORDER BY.
#legacySQL SELECT first, COUNT(ngram) FROM [bigquery-public-data:samples.trigrams] GROUP BY 1 ORDER BY 2 DESC LIMIT 10;
L'aggregazione eseguita utilizzando una clausola GROUP BY è chiamata aggregazione raggruppata
. A differenza dell'aggregazione con ambito, l'aggregazione raggruppata è
comune nella maggior parte dei sistemi di elaborazione SQL.
Il modificatore EACH
Il modificatore EACH è un suggerimento che indica a BigQuery di eseguire GROUP BY
utilizzando più partizioni. Ciò è particolarmente utile quando sai che il tuo set di dati contiene un
gran numero di valori distinti per le chiavi di raggruppamento.
EACH era incoraggiato in molti casi, ma non è più così.
L'utilizzo di GROUP BY senza il modificatore EACH in genere offre un rendimento migliore.
Utilizza GROUP EACH BY quando la query non è andata a buon fine e viene visualizzato un messaggio di errore relativo al superamento delle risorse.
La funzione ROLLUP
Quando viene utilizzata la funzione ROLLUP, BigQuery aggiunge righe aggiuntive al risultato della query che
rappresentano aggregazioni rollup. Tutti i campi elencati dopo ROLLUP devono essere
racchiusi in un unico set di parentesi. Nelle righe aggiunte a causa della funzione ROLLUP, NULL indica le colonne per le quali viene eseguito il rollup dell'aggregazione.
Esempio
Questa query genera conteggi annuali delle nascite di maschi e femmine dal set di dati di esempio sulla natalità.
#legacySQL SELECT year, is_male, COUNT(1) as count FROM [bigquery-public-data:samples.natality] WHERE year >= 2000 AND year <= 2002 GROUP BY ROLLUP(year, is_male) ORDER BY year, is_male;
Questi sono i risultati della query. Nota che ci sono righe in cui una o entrambe le chiavi di gruppo
sono NULL. Queste righe sono le righe di rollup.
+------+---------+----------+ | year | is_male | count | +------+---------+----------+ | NULL | NULL | 12122730 | | 2000 | NULL | 4063823 | | 2000 | false | 1984255 | | 2000 | true | 2079568 | | 2001 | NULL | 4031531 | | 2001 | false | 1970770 | | 2001 | true | 2060761 | | 2002 | NULL | 4027376 | | 2002 | false | 1966519 | | 2002 | true | 2060857 | +------+---------+----------+
Quando utilizzi la funzione ROLLUP, puoi utilizzare la funzione GROUPING
per distinguere le righe aggiunte a causa della funzione ROLLUP e le righe
che hanno effettivamente un valore NULL per la chiave di gruppo.
Esempio
Questa query aggiunge la funzione GROUPING all'esempio precedente per identificare meglio le righe aggiunte a causa della funzione ROLLUP.
#legacySQL SELECT year, GROUPING(year) as rollup_year, is_male, GROUPING(is_male) as rollup_gender, COUNT(1) as count FROM [bigquery-public-data:samples.natality] WHERE year >= 2000 AND year <= 2002 GROUP BY ROLLUP(year, is_male) ORDER BY year, is_male;
Questi sono i risultati restituiti dalla nuova query.
+------+-------------+---------+---------------+----------+ | year | rollup_year | is_male | rollup_gender | count | +------+-------------+---------+---------------+----------+ | NULL | 1 | NULL | 1 | 12122730 | | 2000 | 0 | NULL | 1 | 4063823 | | 2000 | 0 | false | 0 | 1984255 | | 2000 | 0 | true | 0 | 2079568 | | 2001 | 0 | NULL | 1 | 4031531 | | 2001 | 0 | false | 0 | 1970770 | | 2001 | 0 | true | 0 | 2060761 | | 2002 | 0 | NULL | 1 | 4027376 | | 2002 | 0 | false | 0 | 1966519 | | 2002 | 0 | true | 0 | 2060857 | +------+-------------+---------+---------------+----------+
Note:
-
I campi non aggregati nella clausola
SELECTdevono essere elencati nella clausolaGROUP BY.#legacySQL SELECT word, corpus, COUNT(word) FROM [bigquery-public-data:samples.shakespeare] WHERE word CONTAINS "th" GROUP BY word, corpus; /* Succeeds because all non-aggregated fields are group keys. */
#legacySQL SELECT word, corpus, COUNT(word) FROM [bigquery-public-data:samples.shakespeare] WHERE word CONTAINS "th" GROUP BY word; /* Fails because corpus is not aggregated nor is it a group key. */
-
Le espressioni calcolate nella clausola
SELECTnon possono essere utilizzate nella clausolaGROUP BYcorrispondente.#legacySQL SELECT word, corpus, COUNT(word) word_count FROM [bigquery-public-data:samples.shakespeare] WHERE word CONTAINS "th" GROUP BY word, corpus, word_count; /* Fails because word_count is not visible to this
GROUP BYclause. */ - Il raggruppamento per valori float e double non è supportato perché la funzione di uguaglianza per questi tipi non è ben definita.
-
Poiché il sistema è interattivo, le query che producono un numero elevato di gruppi potrebbero non riuscire. L'utilizzo della
funzione
TOPanzichéGROUP BYpotrebbe risolvere alcuni problemi di scalabilità.
Clausola HAVING
La clausola HAVING si comporta esattamente come la clausola WHERE, tranne per il fatto che viene valutata dopo la clausola SELECT, quindi i risultati di tutte le espressioni calcolate sono visibili alla clausola HAVING. La clausola HAVING può fare riferimento solo agli output della clausola SELECT corrispondente.
Esempio
Questa query calcola le prime parole più comuni nel set di dati di esempio ngram che contengono la lettera a e si verificano al massimo 10.000 volte.
#legacySQL SELECT first, COUNT(ngram) ngram_count FROM [bigquery-public-data:samples.trigrams] GROUP BY 1 HAVING first contains "a" AND ngram_count < 10000 ORDER BY 2 DESC LIMIT 10;
Clausola ORDER BY
La clausola ORDER BY ordina i risultati di una query in ordine crescente o decrescente
utilizzando uno o più campi chiave. Per ordinare in base a più campi o alias, inseriscili come elenco separato da virgole. I risultati vengono ordinati in base ai campi nell'ordine in cui sono elencati.
Utilizza DESC (decrescente) o ASC (crescente) per specificare la direzione dell'ordinamento.
ASC è il valore predefinito. Per ogni chiave di ordinamento può essere specificata una direzione di ordinamento diversa.
La clausola ORDER BY viene valutata dopo la clausola SELECT, in modo che possa
fare riferimento all'output di qualsiasi espressione calcolata in SELECT. Se a un campo viene assegnato
un alias nella clausola SELECT, l'alias deve essere utilizzato nella clausola ORDER BY.
Clausola LIMIT
La clausola LIMIT limita il numero di righe nel set di risultati restituito. Poiché le query BigQuery
operano regolarmente su un numero molto elevato di righe, LIMIT è un buon modo per
evitare query di lunga durata elaborando solo un sottoinsieme di righe.
Note:
-
La clausola
LIMITinterromperà l'elaborazione e restituirà i risultati quando soddisferà i tuoi requisiti. In questo modo è possibile ridurre il tempo di elaborazione di alcune query, ma quando specifichi funzioni di aggregazione come COUNT o clausoleORDER BY, l'intero insieme di risultati deve comunque essere elaborato prima di restituire i risultati. La clausolaLIMITè l'ultima a essere valutata. -
Una query con una clausola
LIMITpotrebbe comunque essere non deterministica se non è presente alcun operatore nella query che garantisca l'ordinamento del set di risultati di output. Questo perché BigQuery viene eseguito utilizzando un gran numero di worker paralleli. L'ordine in cui vengono restituiti i job paralleli non è garantito. -
La clausola
LIMITnon può contenere funzioni, ma solo una costante numerica. -
Quando viene utilizzata la clausola
LIMIT, il numero totale di byte elaborati e i byte fatturati possono variare per la stessa query.
Grammatica delle query
Le singole clausole delle istruzioni SELECT di BigQuery sono descritte in dettaglio
sopra. Di seguito è riportata la grammatica completa delle istruzioni SELECT
in un formato compatto con link alle singole sezioni.
query: SELECT { * | field_path.* | expression } [ [ AS ] alias ] [ , ... ] [ FROM from_body [ WHERE bool_expression ] [ OMIT RECORD IF bool_expression] [ GROUP [ EACH ] BY [ ROLLUP ] { field_name_or_alias } [ , ... ] ] [ HAVING bool_expression ] [ ORDER BY field_name_or_alias [ { DESC | ASC } ] [, ... ] ] [ LIMIT n ] ]; from_body: { from_item [, ...] | # Warning: Comma means UNION ALL here from_item [ join_type ] JOIN [ EACH ] from_item [ ON join_predicate ] | (FLATTEN({ table_name | (query) }, field_name_or_alias)) | table_wildcard_function } from_item: { table_name | (query) } [ [ AS ] alias ] join_type: { INNER | [ FULL ] [ OUTER ] | RIGHT [ OUTER ] | LEFT [ OUTER ] | CROSS } join_predicate: field_from_one_side_of_the_join = field_from_the_other_side_of_the_join [ AND ...] expression: { literal_value | field_name_or_alias | function_call } bool_expression: { expression_which_results_in_a_boolean_value | bool_expression AND bool_expression | bool_expression OR bool_expression | NOT bool_expression }
Notazione:
- Le parentesi quadre "[ ]" indicano clausole facoltative.
- Le parentesi graffe "{ }" racchiudono un insieme di opzioni.
- La barra verticale "|" indica un operatore logico OR.
- Una virgola o una parola chiave seguita dai puntini di sospensione tra parentesi quadre "[, ... ]" indica che l'elemento precedente può ripetersi in un elenco con il separatore specificato.
- Le parentesi tonde "( )" indicano parentesi letterali.
Funzioni e operatori supportati
La maggior parte delle clausole dell'istruzione SELECT supporta le funzioni. I campi
a cui viene fatto riferimento in una funzione non devono essere elencati in alcuna clausola SELECT. Pertanto, la seguente query è valida, anche se il
campo clicks non viene visualizzato direttamente:
#legacySQL SELECT country, SUM(clicks) FROM table GROUP BY country;
| Funzioni di aggregazione | |
|---|---|
AVG() |
Restituisce la media dei valori per un gruppo di righe… |
BIT_AND() |
Restituisce il risultato di un'operazione AND bit a bit ... |
BIT_OR() |
Restituisce il risultato di un'operazione OR bit a bit ... |
BIT_XOR() |
Restituisce il risultato di un'operazione XOR bit a bit ... |
CORR() |
Restituisce il coefficiente di correlazione di Pearson di un insieme di coppie di numeri. |
COUNT() |
Restituisce il numero totale di valori ... |
COUNT([DISTINCT]) |
Restituisce il numero totale di valori non NULL ... |
COVAR_POP() |
Calcola la covarianza della popolazione dei valori ... |
COVAR_SAMP() |
Calcola la covarianza campione dei valori ... |
EXACT_COUNT_DISTINCT() |
Restituisce il numero esatto di valori distinti e non NULL per il campo specificato. |
FIRST() |
Restituisce il primo valore sequenziale nell'ambito della funzione. |
GROUP_CONCAT() |
Concatena più stringhe in un'unica stringa… |
GROUP_CONCAT_UNQUOTED() |
Concatena più stringhe in un'unica stringa… non aggiungerà le virgolette doppie… |
LAST() |
Restituisce l'ultimo valore sequenziale ... |
MAX() |
Restituisce il valore massimo ... |
MIN() |
Restituisce il valore minimo… |
NEST() |
Aggrega tutti i valori nell'ambito di aggregazione corrente in un campo ripetuto. |
NTH() |
Restituisce l'ennesimo valore sequenziale ... |
QUANTILES() |
Calcola i valori minimi, massimi e i quantili approssimativi ... |
STDDEV() |
Restituisce la deviazione standard… |
STDDEV_POP() |
Calcola la deviazione standard della popolazione… |
STDDEV_SAMP() |
Calcola la deviazione standard del campione ... |
SUM() |
Restituisce la somma totale dei valori ... |
TOP() ... COUNT(*) |
Restituisce i primi max_records record per frequenza. |
UNIQUE() |
Restituisce l'insieme di valori univoci e non NULL ... |
VARIANCE() |
Calcola la varianza dei valori ... |
VAR_POP() |
Calcola la varianza della popolazione dei valori ... |
VAR_SAMP() |
Calcola la varianza del campione dei valori ... |
| Operatori aritmetici | |
|---|---|
+ |
Aggiunta |
- |
Sottrazione |
* |
Moltiplicazione |
/ |
Divisione |
% |
Modulo |
| Funzioni bitwise | |
|---|---|
& |
AND bit a bit |
| |
OR bit a bit |
^ |
XOR bit a bit |
<< |
Spostamento bit a sinistra |
>> |
Spostamento bit a destra |
~ |
NOT bit a bit |
BIT_COUNT() |
Restituisce il numero di bit ... |
| Funzioni di casting | |
|---|---|
BOOLEAN() |
Esegui il cast su booleano. |
BYTES() |
Trasmetti a byte. |
CAST(expr AS type) |
Converte expr in una variabile di tipo type. |
FLOAT() |
Trasmetti a doppia fila. |
HEX_STRING() |
Esegui il cast alla stringa esadecimale. |
INTEGER() |
Esegui il cast a numero intero. |
STRING() |
Esegui il cast a una stringa. |
| Funzioni di confronto | |
|---|---|
expr1 = expr2 |
Restituisce true se le espressioni sono uguali. |
expr1 != expr2expr1 <> expr2
|
Restituisce true se le espressioni non sono uguali. |
expr1 > expr2 |
Restituisce true se expr1 è maggiore di expr2. |
expr1 < expr2 |
Restituisce true se expr1 è minore di expr2. |
expr1 >= expr2 |
Restituisce true se expr1 è maggiore o uguale a expr2. |
expr1 <= expr2 |
Restituisce true se expr1 è minore o uguale a expr2. |
expr1 BETWEEN expr2 AND expr3 |
Restituisce true se il valore di expr1
è compreso tra expr2 e expr3 inclusi. |
expr IS NULL |
Restituisce true se expr è NULL. |
expr IN() |
Restituisce true se expr corrisponde a
expr1, expr2 o a qualsiasi valore tra parentesi. |
COALESCE() |
Restituisce il primo argomento non NULL. |
GREATEST() |
Restituisce il parametro numeric_expr più grande. |
IFNULL() |
Se l'argomento non è nullo, restituisce l'argomento. |
IS_INF() |
Restituisce true se infinito positivo o negativo. |
IS_NAN() |
Restituisce true se l'argomento è NaN. |
IS_EXPLICITLY_DEFINED() |
deprecato: utilizza expr IS NOT NULL. |
LEAST() |
Restituisce il parametro numeric_expr più piccolo. |
NVL() |
Se expr non è nullo, restituisce expr, altrimenti restituisce null_default. |
| Funzioni di data e ora | |
|---|---|
CURRENT_DATE() |
Restituisce la data corrente nel formato %Y-%m-%d. |
CURRENT_TIME() |
Restituisce l'ora corrente del server nel formato %H:%M:%S. |
CURRENT_TIMESTAMP() |
Restituisce l'ora corrente del server nel formato %Y-%m-%d %H:%M:%S. |
DATE() |
Restituisce la data nel formato %Y-%m-%d. |
DATE_ADD() |
Aggiunge l'intervallo specificato a un tipo di dati TIMESTAMP. |
DATEDIFF() |
Restituisce il numero di giorni compresi tra due tipi di dati TIMESTAMP. |
DAY() |
Restituisce il giorno del mese come numero intero compreso tra 1 e 31. |
DAYOFWEEK() |
Restituisce il giorno della settimana come numero intero compreso tra 1 (domenica) e 7 (sabato). |
DAYOFYEAR() |
Restituisce il giorno dell'anno come numero intero compreso tra 1 e 366. |
FORMAT_UTC_USEC() |
Restituisce un timestamp UNIX nel formato YYYY-MM-DD HH:MM:SS.uuuuuu. |
HOUR() |
Restituisce l'ora di un TIMESTAMP come numero intero compreso tra 0 e 23. |
MINUTE() |
Restituisce i minuti di un TIMESTAMP come numero intero compreso tra 0 e 59. |
MONTH() |
Restituisce il mese di un TIMESTAMP come numero intero compreso tra 1 e 12. |
MSEC_TO_TIMESTAMP() |
Converte un timestamp UNIX in millisecondi in un TIMESTAMP. |
NOW() |
Restituisce il timestamp UNIX corrente in microsecondi. |
PARSE_UTC_USEC() |
Converte una stringa di data in un timestamp UNIX in microsecondi. |
QUARTER() |
Restituisce il trimestre dell'anno di un TIMESTAMP come numero intero compreso tra 1 e 4. |
SEC_TO_TIMESTAMP() |
Converte un timestamp UNIX in secondi in un TIMESTAMP. |
SECOND() |
Restituisce i secondi di un TIMESTAMP come numero intero compreso tra 0 e 59. |
STRFTIME_UTC_USEC() |
Restituisce una stringa di data nel formato date_format_str. |
TIME() |
Restituisce un TIMESTAMP nel formato %H:%M:%S. |
TIMESTAMP() |
Converte una stringa di data in un TIMESTAMP. |
TIMESTAMP_TO_MSEC() |
Converte un TIMESTAMP in un timestamp UNIX in millisecondi. |
TIMESTAMP_TO_SEC() |
Converte un TIMESTAMP in un timestamp UNIX in secondi. |
TIMESTAMP_TO_USEC() |
Converte un TIMESTAMP in un timestamp UNIX in microsecondi. |
USEC_TO_TIMESTAMP() |
Converte un timestamp UNIX in microsecondi in un TIMESTAMP. |
UTC_USEC_TO_DAY() |
Sposta un timestamp UNIX in microsecondi all'inizio del giorno in cui si verifica. |
UTC_USEC_TO_HOUR() |
Sposta un timestamp UNIX in microsecondi all'inizio dell'ora in cui si verifica. |
UTC_USEC_TO_MONTH() |
Sposta un timestamp UNIX in microsecondi all'inizio del mese in cui si verifica. |
UTC_USEC_TO_WEEK() |
Restituisce un timestamp UNIX in microsecondi che rappresenta un giorno della settimana. |
UTC_USEC_TO_YEAR() |
Restituisce un timestamp UNIX in microsecondi che rappresenta l'anno. |
WEEK() |
Restituisce la settimana di un TIMESTAMP come numero intero compreso tra 1 e 53. |
YEAR() |
Restituisce l'anno di un TIMESTAMP. |
| Funzioni IP | |
|---|---|
FORMAT_IP() |
Converte i 32 bit meno significativi di integer_value in una stringa di indirizzo IPv4 leggibile. |
PARSE_IP() |
Converte una stringa che rappresenta l'indirizzo IPv4 in un valore intero non firmato. |
FORMAT_PACKED_IP() |
Restituisce un indirizzo IP leggibile nel formato
10.1.5.23 o 2620:0:1009:1:216:36ff:feef:3f. |
PARSE_PACKED_IP() |
Restituisce un indirizzo IP in BYTES. |
| Funzioni JSON | |
|---|---|
JSON_EXTRACT() |
Seleziona un valore in base all'espressione JSONPath e restituisce una stringa JSON. |
JSON_EXTRACT_SCALAR() |
Seleziona un valore in base all'espressione JSONPath e restituisce uno scalare JSON. |
| Operatori logici | |
|---|---|
expr AND expr |
Restituisce true se entrambe le espressioni sono vere. |
expr OR expr |
Restituisce true se una o entrambe le espressioni sono vere. |
NOT expr |
Restituisce true se l'espressione è false. |
| Funzioni matematiche | |
|---|---|
ABS() |
Restituisce il valore assoluto dell'argomento. |
ACOS() |
Restituisce l'arcocoseno dell'argomento. |
ACOSH() |
Restituisce il coseno iperbolico inverso dell'argomento. |
ASIN() |
Restituisce l'arcoseno dell'argomento. |
ASINH() |
Restituisce l'arcoseno iperbolico dell'argomento. |
ATAN() |
Restituisce l'arcotangente dell'argomento. |
ATANH() |
Restituisce l'arcotangente iperbolica dell'argomento. |
ATAN2() |
Restituisce l'arcotangente dei due argomenti. |
CEIL() |
Arrotonda l'argomento al numero intero più vicino e restituisce il valore arrotondato. |
COS() |
Restituisce il coseno dell'argomento. |
COSH() |
Restituisce il coseno iperbolico dell'argomento. |
DEGREES() |
Converte i radianti in gradi. |
EXP() |
Restituisce e elevato alla potenza dell'argomento. |
FLOOR() |
Arrotonda per difetto l'argomento al numero intero più vicino. |
LN()LOG()
|
Restituisce il logaritmo naturale dell'argomento. |
LOG2() |
Restituisce il logaritmo in base 2 dell'argomento. |
LOG10() |
Restituisce il logaritmo in base 10 dell'argomento. |
PI() |
Restituisce la costante π. |
POW() |
Restituisce il primo argomento elevato alla potenza del secondo argomento. |
RADIANS() |
Converte da gradi a radianti. |
RAND() |
Restituisce un valore in virgola mobile casuale compreso nell'intervallo 0,0 <= valore < 1,0. |
ROUND() |
Arrotonda l'argomento per eccesso o per difetto al numero intero più vicino. |
SIN() |
Restituisce il seno dell'argomento. |
SINH() |
Restituisce il seno iperbolico dell'argomento. |
SQRT() |
Restituisce la radice quadrata dell'espressione. |
TAN() |
Restituisce la tangente dell'argomento. |
TANH() |
Restituisce la tangente iperbolica dell'argomento. |
| Funzioni di espressioni regolari | |
|---|---|
REGEXP_MATCH() |
Restituisce true se l'argomento corrisponde all'espressione regolare. |
REGEXP_EXTRACT() |
Restituisce la parte dell'argomento che corrisponde al gruppo di acquisizione all'interno dell'espressione regolare. |
REGEXP_REPLACE() |
Sostituisce una sottostringa che corrisponde a un'espressione regolare. |
| Funzioni di stringa | |
|---|---|
CONCAT() |
Restituisce la concatenazione di due o più stringhe o NULL se uno dei valori è NULL. |
expr CONTAINS 'str' |
Restituisce true se expr contiene l'argomento stringa specificato. |
INSTR() |
Restituisce l'indice in base 1 della prima occorrenza di una stringa. |
LEFT() |
Restituisce i caratteri più a sinistra di una stringa. |
LENGTH() |
Restituisce la lunghezza della stringa. |
LOWER() |
Restituisce la stringa originale con tutti i caratteri in minuscolo. |
LPAD() |
Inserisce caratteri a sinistra di una stringa. |
LTRIM() |
Rimuove i caratteri dal lato sinistro di una stringa. |
REPLACE() |
Sostituisce tutte le occorrenze di una sottostringa. |
RIGHT() |
Restituisce i caratteri più a destra di una stringa. |
RPAD() |
Inserisce caratteri sul lato destro di una stringa. |
RTRIM() |
Rimuove i caratteri finali dal lato destro di una stringa. |
SPLIT() |
Divide una stringa in sottostringhe ripetute. |
SUBSTR() |
Restituisce una sottostringa… |
UPPER() |
Restituisce la stringa originale con tutti i caratteri in maiuscolo. |
| Funzioni con caratteri jolly nelle tabelle | |
|---|---|
TABLE_DATE_RANGE() |
Esegue query su più tabelle giornaliere che coprono un intervallo di date. |
TABLE_DATE_RANGE_STRICT() |
Esegue query su più tabelle giornaliere che coprono un intervallo di date, senza date mancanti. |
TABLE_QUERY() |
Esegue query sulle tabelle i cui nomi corrispondono a un predicato specificato. |
| Funzioni URL | |
|---|---|
HOST() |
Dato un URL, restituisce il nome host come stringa. |
DOMAIN() |
Dato un URL, restituisce il dominio come stringa. |
TLD() |
Dato un URL, restituisce il dominio di primo livello più qualsiasi dominio nazionale nell'URL. |
| Funzioni finestra | |
|---|---|
AVG()COUNT(*)COUNT([DISTINCT])MAX()MIN()STDDEV()SUM() |
La stessa operazione delle funzioni di aggregazione corrispondenti, ma viene calcolata su una finestra definita dalla clausola OVER. |
CUME_DIST() |
Restituisce un valore double che indica la distribuzione cumulativa di un valore in un gruppo di valori… |
DENSE_RANK() |
Restituisce il rango intero di un valore in un gruppo di valori. |
FIRST_VALUE() |
Restituisce il primo valore del campo specificato nella finestra. |
LAG() |
Consente di leggere i dati di una riga precedente all'interno di una finestra. |
LAST_VALUE() |
Restituisce l'ultimo valore del campo specificato nella finestra. |
LEAD() |
Consente di leggere i dati da una riga successiva all'interno di una finestra. |
NTH_VALUE() |
Restituisce il valore di <expr> nella posizione
<n> del frame della finestra ...
|
NTILE() |
Divide la finestra nel numero specificato di bucket. |
PERCENT_RANK() |
Restituisce il ranking della riga corrente rispetto alle altre righe della partizione. |
PERCENTILE_CONT() |
Restituisce un valore interpolato che verrebbe mappato all'argomento percentile rispetto alla finestra ... |
PERCENTILE_DISC() |
Restituisce il valore più vicino al percentile dell'argomento nella finestra. |
RANK() |
Restituisce il rango intero di un valore in un gruppo di valori. |
RATIO_TO_REPORT() |
Restituisce il rapporto tra ciascun valore e la somma dei valori. |
ROW_NUMBER() |
Restituisce il numero di riga corrente del risultato della query nella finestra. |
| Altre funzioni | |
|---|---|
CASE WHEN ... THEN |
Utilizza CASE per scegliere tra due o più espressioni alternative nella query. |
CURRENT_USER() |
Restituisce l'indirizzo email dell'utente che esegue la query. |
EVERY() |
Restituisce true se l'argomento è true per tutti i suoi input. |
FROM_BASE64() |
Converte la stringa di input con codifica base64 nel formato BYTES. |
HASH() |
Calcola e restituisce un valore hash con segno a 64 bit… |
FARM_FINGERPRINT() |
Calcola e restituisce un valore fingerprint con segno a 64 bit… |
IF() |
Se il primo argomento è true, restituisce il secondo argomento; altrimenti restituisce il terzo argomento. |
POSITION() |
Restituisce la posizione sequenziale basata su 1 dell'argomento. |
SHA1() |
Restituisce un hash SHA1 in formato BYTES. |
SOME() |
Restituisce true se l'argomento è true per almeno uno dei suoi input. |
TO_BASE64() |
Converte l'argomento BYTES in una stringa con codifica base64. |
Funzioni di aggregazione
Le funzioni di aggregazione restituiscono valori che rappresentano riepiloghi di insiemi di dati più grandi, il che le rende particolarmente utili per l'analisi dei log. Una funzione di aggregazione opera su una raccolta di valori e restituisce un singolo valore per tabella, gruppo o ambito:
- Aggregazione tabella
Utilizza una funzione di aggregazione per riepilogare tutte le righe idonee della tabella. Ad esempio:
SELECT COUNT(f1) FROM ds.Table; - Aggregazione di gruppi
Utilizza una funzione aggregata e una clausola
GROUP BYche specifica un campo non aggregato per riepilogare le righe per gruppo. Ad esempio:SELECT COUNT(f1) FROM ds.Table GROUP BY b1;La funzione TOP rappresenta un caso speciale di aggregazione di gruppo.
- Aggregazione con ambito
Questa funzionalità si applica solo alle tabelle con campi nidificati.
Utilizza una funzione di aggregazione e la parola chiaveWITHINper aggregare i valori ripetuti in un ambito definito. Ad esempio:SELECT COUNT(m1.f2) WITHIN RECORD FROM Table;L'ambito può essere
RECORD, che corrisponde all'intera riga, o un nodo (campo ripetuto in una riga). Le funzioni di aggregazione operano sui valori all'interno dell'ambito e restituiscono risultati aggregati per ogni record o nodo.
Puoi applicare una limitazione a una funzione di aggregazione utilizzando una delle seguenti opzioni:
-
Un alias in una query di selezione secondaria. La limitazione è specificata nella clausola
WHEREesterna.#legacySQL SELECT corpus, count_corpus_words FROM (SELECT corpus, count(word) AS count_corpus_words FROM [bigquery-public-data:samples.shakespeare] GROUP BY corpus) AS sub_shakespeare WHERE count_corpus_words > 4000
-
Un alias in una clausola HAVING.
#legacySQL SELECT corpus, count(word) AS count_corpus_words FROM [bigquery-public-data:samples.shakespeare] GROUP BY corpus HAVING count_corpus_words > 4000;
Puoi anche fare riferimento a un alias nelle clausole GROUP BY o ORDER BY.
Sintassi
| Funzioni di aggregazione | |
|---|---|
AVG() |
Restituisce la media dei valori per un gruppo di righe… |
BIT_AND() |
Restituisce il risultato di un'operazione AND bit a bit ... |
BIT_OR() |
Restituisce il risultato di un'operazione OR bit a bit ... |
BIT_XOR() |
Restituisce il risultato di un'operazione XOR bit a bit ... |
CORR() |
Restituisce il coefficiente di correlazione di Pearson di un insieme di coppie di numeri. |
COUNT() |
Restituisce il numero totale di valori ... |
COUNT([DISTINCT]) |
Restituisce il numero totale di valori non NULL ... |
COVAR_POP() |
Calcola la covarianza della popolazione dei valori ... |
COVAR_SAMP() |
Calcola la covarianza campione dei valori ... |
EXACT_COUNT_DISTINCT() |
Restituisce il numero esatto di valori distinti e non NULL per il campo specificato. |
FIRST() |
Restituisce il primo valore sequenziale nell'ambito della funzione. |
GROUP_CONCAT() |
Concatena più stringhe in un'unica stringa… |
GROUP_CONCAT_UNQUOTED() |
Concatena più stringhe in un'unica stringa… non aggiungerà le virgolette doppie… |
LAST() |
Restituisce l'ultimo valore sequenziale ... |
MAX() |
Restituisce il valore massimo ... |
MIN() |
Restituisce il valore minimo… |
NEST() |
Aggrega tutti i valori nell'ambito di aggregazione corrente in un campo ripetuto. |
NTH() |
Restituisce l'ennesimo valore sequenziale ... |
QUANTILES() |
Calcola i valori minimi, massimi e i quantili approssimativi ... |
STDDEV() |
Restituisce la deviazione standard… |
STDDEV_POP() |
Calcola la deviazione standard della popolazione… |
STDDEV_SAMP() |
Calcola la deviazione standard del campione ... |
SUM() |
Restituisce la somma totale dei valori ... |
TOP() ... COUNT(*) |
Restituisce i primi max_records record per frequenza. |
UNIQUE() |
Restituisce l'insieme di valori univoci e non NULL ... |
VARIANCE() |
Calcola la varianza dei valori ... |
VAR_POP() |
Calcola la varianza della popolazione dei valori ... |
VAR_SAMP() |
Calcola la varianza del campione dei valori ... |
AVG(numeric_expr)- Restituisce la media dei valori per un gruppo di righe calcolata da
numeric_expr. Le righe con un valore NULL non sono incluse nel calcolo. BIT_AND(numeric_expr)- Restituisce il risultato di un'operazione
ANDbit a bit tra ogni istanza dinumeric_exprin tutte le righe. I valoriNULLvengono ignorati. Questa funzione restituisceNULLse tutte le istanze dinumeric_exprrestituisconoNULL. BIT_OR(numeric_expr)- Restituisce il risultato di un'operazione
ORbit a bit tra ogni istanza dinumeric_exprin tutte le righe. I valoriNULLvengono ignorati. Questa funzione restituisceNULLse tutte le istanze dinumeric_exprrestituisconoNULL. BIT_XOR(numeric_expr)- Restituisce il risultato di un'operazione
XORbit a bit tra ogni istanza dinumeric_exprin tutte le righe. I valoriNULLvengono ignorati. Questa funzione restituisceNULLse tutte le istanze dinumeric_exprrestituisconoNULL. CORR(numeric_expr, numeric_expr)- Restituisce il coefficiente di correlazione di Pearson di un insieme di coppie di numeri.
COUNT(*)- Restituisce il numero totale di valori (NULL e non NULL) nell'ambito della funzione. A meno che tu non stia utilizzando
COUNT(*)con la funzioneTOP, è meglio specificare esplicitamente il campo da conteggiare. COUNT([DISTINCT] field [, n])- Restituisce il numero totale di valori non NULL nell'ambito della funzione.
Se utilizzi la parola chiave
DISTINCT, la funzione restituisce il numero di valori distinti per il campo specificato. Tieni presente che il valore restituito perDISTINCTè un'approssimazione statistica e non è garantito che sia esatto.Utilizza
EXACT_COUNT_DISTINCT()per una risposta esatta.Se hai bisogno di una maggiore precisione da
, puoi specificare un secondo parametro,COUNT(DISTINCT)n, che indica la soglia al di sotto della quale i risultati esatti sono garantiti. Per impostazione predefinita,nè 1000, ma se fornisci un valorenpiù elevato, otterrai risultati esatti perCOUNT(DISTINCT)fino a quel valore din. Tuttavia, l'assegnazione di valori più grandi dinridurrà la scalabilità di questo operatore e potrebbe aumentare notevolmente il tempo di esecuzione della query o causarne l'esito negativo.Per calcolare il numero esatto di valori distinti, utilizza EXACT_COUNT_DISTINCT. In alternativa, per un approccio più scalabile, valuta la possibilità di utilizzare
GROUP EACH BYnei campi pertinenti e poi applicaCOUNT(*). L'approccioGROUP EACH BYè più scalabile, ma potrebbe comportare una leggera penalizzazione iniziale delle prestazioni. COVAR_POP(numeric_expr1, numeric_expr2)- Calcola la covarianza della popolazione dei valori calcolati da
numeric_expr1enumeric_expr2. COVAR_SAMP(numeric_expr1, numeric_expr2)- Calcola la covarianza campione dei valori calcolati da
numeric_expr1enumeric_expr2. EXACT_COUNT_DISTINCT(field)- Restituisce il numero esatto di valori distinti e non NULL per il campo specificato. Per una migliore scalabilità e prestazioni, utilizza COUNT(DISTINCT field).
FIRST(expr)- Restituisce il primo valore sequenziale nell'ambito della funzione.
GROUP_CONCAT('str' [, separator])-
Concatena più stringhe in un'unica stringa, in cui ogni valore è separato dal parametro facoltativo
separator. Seseparatorviene omesso, BigQuery restituisce una stringa separata da virgole.Se una stringa nei dati di origine contiene un carattere virgolette doppie,
GROUP_CONCATrestituisce la stringa con le virgolette doppie aggiunte. Ad esempio, la stringaa"bverrà restituita come"a""b". UtilizzaGROUP_CONCAT_UNQUOTEDse preferisci che queste stringhe non vengano restituite con l'aggiunta di virgolette doppie.Esempio:
#legacySQL SELECT GROUP_CONCAT(x) FROM ( SELECT 'a"b' AS x), ( SELECT 'cd' AS x);
GROUP_CONCAT_UNQUOTED('str' [, separator])-
Concatena più stringhe in un'unica stringa, in cui ogni valore è separato dal parametro facoltativo
separator. Seseparatorviene omesso, BigQuery restituisce una stringa separata da virgole.A differenza di
GROUP_CONCAT, questa funzione non aggiunge virgolette doppie ai valori restituiti che includono un carattere virgolette doppie. Ad esempio, la stringaa"bverrà restituita comea"b.Esempio:
#legacySQL SELECT GROUP_CONCAT_UNQUOTED(x) FROM ( SELECT 'a"b' AS x), ( SELECT 'cd' AS x);
LAST(field)- Restituisce l'ultimo valore sequenziale nell'ambito della funzione.
MAX(field)- Restituisce il valore massimo nell'ambito della funzione.
MIN(field)- Restituisce il valore minimo nell'ambito della funzione.
NEST(expr)-
Aggrega tutti i valori nell'ambito di aggregazione corrente in un campo ripetuto. Ad esempio, la query
"SELECT x, NEST(y) FROM ... GROUP BY x"restituisce un record di output per ogni valorexdistinto e contiene un campo ripetuto per tutti i valoriyaccoppiati axnell'input della query. La funzioneNESTrichiede una clausolaGROUP BY.BigQuery appiattisce automaticamente i risultati delle query, quindi se utilizzi la funzione
NESTnella query di primo livello, i risultati non conterranno campi ripetuti. Utilizza la funzioneNESTquando utilizzi una sottoquery che produce risultati intermedi da utilizzare immediatamente nella stessa query. NTH(n, field)- Restituisce il
n° valore sequenziale nell'ambito della funzione, dovenè una costante. La funzioneNTHinizia il conteggio da 1, quindi non esiste un termine zero. Se l'ambito della funzione ha meno dinvalori, la funzione restituisceNULL. QUANTILES(expr[, buckets])-
Calcola i valori minimi, massimi e i quantili approssimativi per l'espressione di input. I valori di input
NULLvengono ignorati. Un input vuoto o esclusivamenteNULLgenera un outputNULL. Il numero di quantili calcolati è controllato dal parametro facoltativobuckets, che include il minimo e il massimo nel conteggio. Per calcolare gli N-tile approssimativi, utilizza N+1buckets. Il valore predefinito dibucketsè 100. Nota: il valore predefinito 100 non stima i percentili. Per stimare i percentili, utilizza almeno 101buckets.) Se specificato in modo esplicito,bucketsdeve essere almeno 2.L'errore frazionario per quantile è epsilon = 1 /
buckets, il che significa che l'errore diminuisce all'aumentare del numero di bucket. Ad esempio:QUANTILES(<expr>, 2) # computes min and max with 50% error. QUANTILES(<expr>, 3) # computes min, median, and max with 33% error. QUANTILES(<expr>, 5) # computes quartiles with 25% error. QUANTILES(<expr>, 11) # computes deciles with 10% error. QUANTILES(<expr>, 21) # computes vigintiles with 5% error. QUANTILES(<expr>, 101) # computes percentiles with 1% error.
La funzione
NTHpuò essere utilizzata per scegliere un quantile specifico, ma ricorda cheNTHè basata su 1 e cheQUANTILESrestituisce il minimo (il quantile "0") nella prima posizione e il massimo (il percentile "100" o l'N-tile "N") nell'ultima posizione. Ad esempio,NTH(11, QUANTILES(expr, 21))stima la mediana diexpr, mentreNTH(20, QUANTILES(expr, 21))stima il 19° vigintile (95° percentile) diexpr. Entrambe le stime hanno un margine di errore del 5%.Per migliorare la precisione, utilizza più bucket. Ad esempio, per ridurre il margine di errore per i calcoli precedenti dal 5% allo 0,1%, utilizza 1001 bucket anziché 21 e modifica l'argomento della funzione
NTHdi conseguenza. Per calcolare la mediana con un errore dello 0,1%, utilizzaNTH(501, QUANTILES(expr, 1001)); per il 95° percentile con un errore dello 0,1%, utilizzaNTH(951, QUANTILES(expr, 1001)). STDDEV(numeric_expr)- Restituisce la deviazione standard dei valori calcolati da
numeric_expr. Le righe con un valore NULL non sono incluse nel calcolo. La funzioneSTDDEVè un alias diSTDDEV_SAMP. STDDEV_POP(numeric_expr)- Calcola la deviazione standard della popolazione del valore calcolato da
numeric_expr. UtilizzaSTDDEV_POP()per calcolare la deviazione standard di un set di dati che comprende l'intera popolazione di interesse. Se il tuo set di dati comprende solo un campione rappresentativo della popolazione, utilizzaSTDDEV_SAMP(). Per ulteriori informazioni sulla deviazione standard della popolazione rispetto a quella del campione, consulta Deviazione standard su Wikipedia. STDDEV_SAMP(numeric_expr)- Calcola la deviazione standard del campione del valore calcolato da
numeric_expr. UtilizzaSTDDEV_SAMP()per calcolare la deviazione standard di un'intera popolazione in base a un campione rappresentativo della popolazione. Se il tuo set di dati comprende l'intera popolazione, utilizza inveceSTDDEV_POP(). Per ulteriori informazioni sulla deviazione standard della popolazione rispetto a quella del campione, consulta Deviazione standard su Wikipedia. SUM(field)- Restituisce la somma totale dei valori nell'ambito della funzione. Da utilizzare solo con tipi di dati numerici.
TOP(field|alias[, max_values][,multiplier]) ... COUNT(*)- Restituisce i primi max_records record per frequenza. Per maggiori dettagli, consulta la descrizione della TOP riportata di seguito.
UNIQUE(expr)- Restituisce l'insieme di valori univoci e non NULL nell'ambito della funzione in un ordine non definito. Analogamente a una clausola
GROUP BYdi grandi dimensioni senza la parola chiaveEACH, la query avrà esito negativo con l'errore "Risorse superate" se sono presenti troppi valori distinti. A differenza diGROUP BY, tuttavia, la funzioneUNIQUEpuò essere applicata con l'aggregazione con ambito, consentendo un'operazione efficiente sui campi nidificati con un numero limitato di valori. VARIANCE(numeric_expr)- Calcola la varianza dei valori calcolati da
numeric_expr. Le righe con un valore NULL non sono incluse nel calcolo. La funzioneVARIANCEè un alias diVAR_SAMP. VAR_POP(numeric_expr)- Calcola la varianza della popolazione dei valori calcolati da
numeric_expr. Per ulteriori informazioni sulla deviazione standard della popolazione rispetto a quella del campione, consulta Deviazione standard su Wikipedia. VAR_SAMP(numeric_expr)- Calcola la varianza del campione dei valori calcolati da
numeric_expr. Per ulteriori informazioni sulla deviazione standard della popolazione rispetto a quella del campione, consulta Deviazione standard su Wikipedia.
Funzione TOP()
TOP è una funzione alternativa alla clausola GROUP BY. Viene utilizzata come sintassi semplificata per GROUP BY ... ORDER BY ... LIMIT .... In genere, la funzione TOP viene eseguita più rapidamente rispetto alla query ... GROUP BY ... ORDER BY ... LIMIT ... completa, ma potrebbe restituire solo risultati approssimativi. Di seguito è riportata la sintassi della funzione TOP:
TOP(field|alias[, max_values][,multiplier]) ... COUNT(*)
Quando utilizzi TOP in una clausola SELECT, devi includere COUNT(*) come uno dei campi.
Una query che utilizza la funzione TOP() può restituire solo due campi: il campo TOP e il valore COUNT(*).
field|alias- Il campo o l'alias da restituire.
max_values- [Facoltativo] Il numero massimo di risultati da restituire. Il valore predefinito è 20.
multiplier- Un numero intero positivo che aumenta il valore o i valori restituiti da
COUNT(*)del multiplo specificato.
Esempi di TOP()
-
Query di esempio di base che utilizzano
TOP()Le seguenti query utilizzano
TOP()per restituire 10 righe.Esempio 1:
#legacySQL SELECT TOP(word, 10) as word, COUNT(*) as cnt FROM [bigquery-public-data:samples.shakespeare] WHERE word CONTAINS "th";
Esempio 2:
#legacySQL SELECT word, left(word, 3) FROM (SELECT TOP(word, 10) AS word, COUNT(*) FROM [bigquery-public-data:samples.shakespeare] WHERE word CONTAINS "th");
-
Confronta
TOP()eGROUP BY...ORDER BY...LIMITLa query restituisce, in ordine, le 10 parole più utilizzate contenenti "th" e il numero di documenti in cui sono state utilizzate. La query
TOPverrà eseguita molto più rapidamente:Esempio senza
TOP():#legacySQL SELECT word, COUNT(*) AS cnt FROM ds.Table WHERE word CONTAINS 'th' GROUP BY word ORDER BY cnt DESC LIMIT 10;
Esempio con
TOP():#legacySQL SELECT TOP(word, 10), COUNT(*) FROM ds.Table WHERE word contains 'th';
-
Utilizzo del parametro
multiplier.Le seguenti query mostrano in che modo il parametro
multiplierinfluisce sul risultato della query. La prima query restituisce il numero di nascite al mese nel Wyoming. La seconda query utilizza il parametromultiplierper moltiplicare i valori dicntper 100.Esempio senza il parametro
multiplier:#legacySQL SELECT TOP(month,3) as month, COUNT(*) as cnt FROM [bigquery-public-data:samples.natality] WHERE state = "WY";
Resi:
+-------+-------+ | month | cnt | +-------+-------+ | 7 | 19594 | | 5 | 19038 | | 8 | 19030 | +-------+-------+
Esempio con il parametro
multiplier:#legacySQL SELECT TOP(month,3,100) as month, COUNT(*) as cnt FROM [bigquery-public-data:samples.natality] WHERE state = "WY";
Resi:
+-------+---------+ | month | cnt | +-------+---------+ | 7 | 1959400 | | 5 | 1903800 | | 8 | 1903000 | +-------+---------+
Nota:per utilizzare TOP, devi includere COUNT(*) nella clausola SELECT.
Esempi avanzati
-
Media e deviazione standard raggruppate per condizione
La seguente query restituisce la media e la deviazione standard dei pesi alla nascita in Ohio nel 2003, raggruppati in base alle madri che fumano e a quelle che non fumano.
Esempio:
#legacySQL SELECT cigarette_use, /* Finds average and standard deviation */ AVG(weight_pounds) baby_weight, STDDEV(weight_pounds) baby_weight_stdev, AVG(mother_age) mother_age FROM [bigquery-public-data:samples.natality] WHERE year=2003 AND state='OH' /* Group the result values by those */ /* who smoked and those who didn't. */ GROUP BY cigarette_use;
-
Filtrare i risultati della query utilizzando un valore aggregato
Per filtrare i risultati della query utilizzando un valore aggregato (ad esempio, filtrando in base al valore di un
SUM), utilizza la funzioneHAVING.HAVINGconfronta un valore con un risultato determinato da una funzione di aggregazione, a differenza diWHERE, che opera su ogni riga prima dell'aggregazione.Esempio:
#legacySQL SELECT state, /* If 'is_male' is True, return 'Male', */ /* otherwise return 'Female' */ IF (is_male, 'Male', 'Female') AS sex, /* The count value is aliased as 'cnt' */ /* and used in the HAVING clause below. */ COUNT(*) AS cnt FROM [bigquery-public-data:samples.natality] WHERE state != '' GROUP BY state, sex HAVING cnt > 3000000 ORDER BY cnt DESC
Resi:
+-------+--------+---------+ | state | sex | cnt | +-------+--------+---------+ | CA | Male | 7060826 | | CA | Female | 6733288 | | TX | Male | 5107542 | | TX | Female | 4879247 | | NY | Male | 4442246 | | NY | Female | 4227891 | | IL | Male | 3089555 | +-------+--------+---------+
Operatori aritmetici
Gli operatori aritmetici accettano argomenti numerici e restituiscono un risultato numerico. Ogni argomento può essere un valore letterale numerico o un valore numerico restituito da una query. Se l'operazione aritmetica restituisce un risultato indefinito, l'operazione restituisce NULL.
Sintassi
| Operatore | Descrizione | Esempio |
|---|---|---|
| + | Aggiunta |
Rendimento: 10 |
| - | Sottrazione |
Restituisce: 1 |
| * | Moltiplicazione |
Resi: 24 |
| / | Divisione |
Resi: 1,5 |
| % | Modulo |
Resi: 2 |
Funzioni bitwise
Le funzioni bitwise operano a livello di singoli bit e richiedono argomenti numerici. Per saperne di più sulle funzioni bitwise, consulta Operazione bitwise.
Tre funzioni bitwise aggiuntive, BIT_AND, BIT_OR e BIT_XOR, sono documentate nelle funzioni di aggregazione.
Sintassi
| Operatore | Descrizione | Esempio |
|---|---|---|
| & | AND bit a bit |
Restituisce: 0 |
| | | OR bit a bit |
Resi: 28 |
| ^ | XOR bit a bit |
Restituisce: 1 |
| << | Spostamento bit a sinistra |
Resi: 16 |
| >> | Spostamento bit a destra |
Resi: 2 |
| ~ | NOT bit a bit |
Resi: -3 |
BIT_COUNT(<numeric_expr>) |
Restituisce il numero di bit impostati in |
Resi: 4 |
Funzioni di casting
Le funzioni di casting modificano il tipo di dati di un'espressione numerica. Le funzioni di casting sono particolarmente utili per garantire che gli argomenti di una funzione di confronto abbiano lo stesso tipo di dati.
Sintassi
| Funzioni di casting | |
|---|---|
BOOLEAN() |
Esegui il cast su booleano. |
BYTES() |
Trasmetti a byte. |
CAST(expr AS type) |
Converte expr in una variabile di tipo type. |
FLOAT() |
Trasmetti a doppia fila. |
HEX_STRING() |
Esegui il cast alla stringa esadecimale. |
INTEGER() |
Esegui il cast a numero intero. |
STRING() |
Esegui il cast a una stringa. |
BOOLEAN(<numeric_expr>)-
- Restituisce
truese<numeric_expr>non è 0 e non è NULL. - Restituisce
falsese<numeric_expr>è 0. - Restituisce
NULLse<numeric_expr>è NULL.
- Restituisce
BYTES(string_expr)- Restituisce
string_exprcome valore di tipobytes. CAST(expr AS type)- Converte
exprin una variabile di tipotype. FLOAT(expr)-
Restituisce
exprcome numero double.exprpuò essere una stringa come'45.78', ma la funzione restituisceNULLper i valori non numerici. HEX_STRING(numeric_expr)- Restituisce
numeric_exprcome stringa esadecimale. INTEGER(expr)-
Esegue il cast di
exprin un numero intero a 64 bit.- Restituisce NULL se
exprè una stringa che non corrisponde a un valore intero. - Restituisce il numero di microsecondi dall'epoca Unix se
exprè un timestamp.
- Restituisce NULL se
STRING(numeric_expr)- restituisce
numeric_exprcome stringa.
Funzioni di confronto
Le funzioni di confronto restituiscono true o false, in base ai seguenti tipi di confronti:
- Un confronto tra due espressioni.
- Un confronto di un'espressione o di un insieme di espressioni con un criterio specifico, ad esempio l'appartenenza a un elenco specificato, il valore NULL o un valore facoltativo non predefinito.
Alcune delle funzioni elencate di seguito restituiscono valori diversi da true o false, ma i valori restituiti si basano su operazioni di confronto.
Puoi utilizzare espressioni numeriche o stringhe come argomenti per le funzioni di confronto. Le costanti stringa devono essere racchiuse tra virgolette singole o doppie. Le espressioni possono essere valori letterali o valori recuperati da una query. Le funzioni di confronto vengono utilizzate più spesso come condizioni di filtro nelle clausole WHERE, ma possono essere utilizzate anche in altre clausole.
Sintassi
| Funzioni di confronto | |
|---|---|
expr1 = expr2 |
Restituisce true se le espressioni sono uguali. |
expr1 != expr2expr1 <> expr2
|
Restituisce true se le espressioni non sono uguali. |
expr1 > expr2 |
Restituisce true se expr1 è maggiore di expr2. |
expr1 < expr2 |
Restituisce true se expr1 è minore di expr2. |
expr1 >= expr2 |
Restituisce true se expr1 è maggiore o uguale a expr2. |
expr1 <= expr2 |
Restituisce true se expr1 è minore o uguale a expr2. |
expr1 BETWEEN expr2 AND expr3 |
Restituisce true se il valore di expr1
è compreso tra expr2 e expr3 inclusi. |
expr IS NULL |
Restituisce true se expr è NULL. |
expr IN() |
Restituisce true se expr corrisponde a
expr1, expr2 o a qualsiasi valore tra parentesi. |
COALESCE() |
Restituisce il primo argomento non NULL. |
GREATEST() |
Restituisce il parametro numeric_expr più grande. |
IFNULL() |
Se l'argomento non è nullo, restituisce l'argomento. |
IS_INF() |
Restituisce true se infinito positivo o negativo. |
IS_NAN() |
Restituisce true se l'argomento è NaN. |
IS_EXPLICITLY_DEFINED() |
deprecato: utilizza expr IS NOT NULL. |
LEAST() |
Restituisce il parametro numeric_expr più piccolo. |
NVL() |
Se expr non è nullo, restituisce expr, altrimenti restituisce null_default. |
expr1 = expr2- Restituisce
truese le espressioni sono uguali. expr1 != expr2
expr1 <> expr2- Restituisce
truese le espressioni non sono uguali. expr1 > expr2- Restituisce
trueseexpr1è maggiore diexpr2. expr1 < expr2- Restituisce
trueseexpr1è inferiore aexpr2. expr1 >= expr2- Restituisce
trueseexpr1è maggiore o uguale aexpr2. expr1 <= expr2- Restituisce
trueseexpr1è minore o uguale aexpr2. expr1 BETWEEN expr2 AND expr3-
Restituisce
truese il valore diexpr1è maggiore o uguale aexpr2e minore o uguale aexpr3. expr IS NULL- Restituisce
trueseexprè NULL. expr IN(expr1, expr2, ...)- Restituisce
trueseexprcorrisponde aexpr1,expr2o a qualsiasi valore tra parentesi. La parola chiaveINè un'abbreviazione efficace di(expr = expr1 || expr = expr2 || ...). Le espressioni utilizzate con la parola chiaveINdevono essere costanti e devono corrispondere al tipo di dati diexpr. La clausolaINpuò essere utilizzata anche per creare semi-join e anti-join. Per saperne di più, vedi Semi-join e Anti-join. COALESCE(<expr1>, <expr2>, ...)- Restituisce il primo argomento non NULL.
GREATEST(numeric_expr1, numeric_expr2, ...)-
Restituisce il parametro
numeric_exprpiù grande. Tutti i parametri devono essere numerici e dello stesso tipo. Se un parametro èNULL, questa funzione restituisceNULL.Per ignorare i valori
NULL, utilizza la funzioneIFNULLper modificare i valoriNULLin un valore che non influisce sul confronto. Nel seguente esempio di codice, la funzioneIFNULLviene utilizzata per modificare i valoriNULLin-1, il che non influisce sul confronto tra numeri positivi.SELECT GREATEST(IFNULL(a,-1), IFNULL(b,-1)) FROM (SELECT 1 as a, NULL as b);
IFNULL(expr, null_default)- Se
exprnon è nullo, restituisceexpr, altrimenti restituiscenull_default. IS_INF(numeric_expr)- Restituisce
truesenumeric_exprè infinito positivo o negativo. IS_NAN(numeric_expr)- Restituisce
truesenumeric_exprè il valore numerico specialeNaN. IS_EXPLICITLY_DEFINED(expr)-
Questa funzione è deprecata. Utilizza invece
expr IS NOT NULL. LEAST(numeric_expr1, numeric_expr2, ...)-
Restituisce il parametro
numeric_exprpiù piccolo. Tutti i parametri devono essere numerici e dello stesso tipo. Se un parametro èNULL, questa funzione restituisceNULL NVL(expr, null_default)- Se
exprnon è nullo, restituisceexpr, altrimenti restituiscenull_default. La funzioneNVLè un alias diIFNULL.
Funzioni di data e ora
Le seguenti funzioni consentono la manipolazione di data e ora per i timestamp UNIX, le stringhe di data e i tipi di dati TIMESTAMP. Per saperne di più sull'utilizzo del tipo di dati TIMESTAMP, consulta Utilizzo di TIMESTAMP.
Le funzioni di data e ora che funzionano con i timestamp UNIX operano su ora UNIX. Le funzioni di data e ora restituiscono valori basati sul fuso orario UTC.
Sintassi
| Funzioni di data e ora | |
|---|---|
CURRENT_DATE() |
Restituisce la data corrente nel formato %Y-%m-%d. |
CURRENT_TIME() |
Restituisce l'ora corrente del server nel formato %H:%M:%S. |
CURRENT_TIMESTAMP() |
Restituisce l'ora corrente del server nel formato %Y-%m-%d %H:%M:%S. |
DATE() |
Restituisce la data nel formato %Y-%m-%d. |
DATE_ADD() |
Aggiunge l'intervallo specificato a un tipo di dati TIMESTAMP. |
DATEDIFF() |
Restituisce il numero di giorni compresi tra due tipi di dati TIMESTAMP. |
DAY() |
Restituisce il giorno del mese come numero intero compreso tra 1 e 31. |
DAYOFWEEK() |
Restituisce il giorno della settimana come numero intero compreso tra 1 (domenica) e 7 (sabato). |
DAYOFYEAR() |
Restituisce il giorno dell'anno come numero intero compreso tra 1 e 366. |
FORMAT_UTC_USEC() |
Restituisce un timestamp UNIX nel formato YYYY-MM-DD HH:MM:SS.uuuuuu. |
HOUR() |
Restituisce l'ora di un TIMESTAMP come numero intero compreso tra 0 e 23. |
MINUTE() |
Restituisce i minuti di un TIMESTAMP come numero intero compreso tra 0 e 59. |
MONTH() |
Restituisce il mese di un TIMESTAMP come numero intero compreso tra 1 e 12. |
MSEC_TO_TIMESTAMP() |
Converte un timestamp UNIX in millisecondi in un TIMESTAMP. |
NOW() |
Restituisce il timestamp UNIX corrente in microsecondi. |
PARSE_UTC_USEC() |
Converte una stringa di data in un timestamp UNIX in microsecondi. |
QUARTER() |
Restituisce il trimestre dell'anno di un TIMESTAMP come numero intero compreso tra 1 e 4. |
SEC_TO_TIMESTAMP() |
Converte un timestamp UNIX in secondi in un TIMESTAMP. |
SECOND() |
Restituisce i secondi di un TIMESTAMP come numero intero compreso tra 0 e 59. |
STRFTIME_UTC_USEC() |
Restituisce una stringa di data nel formato date_format_str. |
TIME() |
Restituisce un TIMESTAMP nel formato %H:%M:%S. |
TIMESTAMP() |
Converte una stringa di data in un TIMESTAMP. |
TIMESTAMP_TO_MSEC() |
Converte un TIMESTAMP in un timestamp UNIX in millisecondi. |
TIMESTAMP_TO_SEC() |
Converte un TIMESTAMP in un timestamp UNIX in secondi. |
TIMESTAMP_TO_USEC() |
Converte un TIMESTAMP in un timestamp UNIX in microsecondi. |
USEC_TO_TIMESTAMP() |
Converte un timestamp UNIX in microsecondi in un TIMESTAMP. |
UTC_USEC_TO_DAY() |
Sposta un timestamp UNIX in microsecondi all'inizio del giorno in cui si verifica. |
UTC_USEC_TO_HOUR() |
Sposta un timestamp UNIX in microsecondi all'inizio dell'ora in cui si verifica. |
UTC_USEC_TO_MONTH() |
Sposta un timestamp UNIX in microsecondi all'inizio del mese in cui si verifica. |
UTC_USEC_TO_WEEK() |
Restituisce un timestamp UNIX in microsecondi che rappresenta un giorno della settimana. |
UTC_USEC_TO_YEAR() |
Restituisce un timestamp UNIX in microsecondi che rappresenta l'anno. |
WEEK() |
Restituisce la settimana di un TIMESTAMP come numero intero compreso tra 1 e 53. |
YEAR() |
Restituisce l'anno di un TIMESTAMP. |
CURRENT_DATE()Restituisce una stringa leggibile della data corrente nel formato
%Y-%m-%d.Esempio:
SELECT CURRENT_DATE();Restituisce: 2013-02-01
CURRENT_TIME()Restituisce una stringa leggibile dell'ora corrente del server nel formato
%H:%M:%S.Esempio:
SELECT CURRENT_TIME();Resi: 01:32:56
CURRENT_TIMESTAMP()Restituisce un tipo di dati TIMESTAMP dell'ora corrente del server nel formato
%Y-%m-%d %H:%M:%S.Esempio:
SELECT CURRENT_TIMESTAMP();Restituisce: 2013-02-01 01:33:35 UTC
DATE(<timestamp>)Restituisce una stringa leggibile di un tipo di dati TIMESTAMP nel formato
%Y-%m-%d.Esempio:
SELECT DATE(TIMESTAMP('2012-10-01 02:03:04'));Resi: 01/10/2012
DATE_ADD(<timestamp>,<interval>,
<interval_units>)Aggiunge l'intervallo specificato a un tipo di dati TIMESTAMP. I valori possibili di
interval_unitsincludonoYEAR,MONTH,DAY,HOUR,MINUTEeSECOND. Seintervalè un numero negativo, l'intervallo viene sottratto dal tipo di dati TIMESTAMP.Esempio:
SELECT DATE_ADD(TIMESTAMP("2012-10-01 02:03:04"), 5, "YEAR");Restituisce: 2017-10-01 02:03:04 UTC
SELECT DATE_ADD(TIMESTAMP("2012-10-01 02:03:04"), -5, "YEAR");Restituisce: 2007-10-01 02:03:04 UTC
DATEDIFF(<timestamp1>,<timestamp2>)Restituisce il numero di giorni compresi tra due tipi di dati TIMESTAMP. Il risultato è positivo se il primo tipo di dati TIMESTAMP è successivo al secondo tipo di dati TIMESTAMP, altrimenti il risultato è negativo.
Esempio:
SELECT DATEDIFF(TIMESTAMP('2012-10-02 05:23:48'), TIMESTAMP('2011-06-24 12:18:35'));Resi: 466
Esempio:
SELECT DATEDIFF(TIMESTAMP('2011-06-24 12:18:35'), TIMESTAMP('2012-10-02 05:23:48'));Resi: -466
DAY(<timestamp>)Restituisce il giorno del mese di un tipo di dati TIMESTAMP come numero intero compreso tra 1 e 31 inclusi.
Esempio:
SELECT DAY(TIMESTAMP('2012-10-02 05:23:48'));Resi: 2
DAYOFWEEK(<timestamp>)Restituisce il giorno della settimana di un tipo di dati TIMESTAMP come numero intero compreso tra 1 (domenica) e 7 (sabato), inclusi.
Esempio:
SELECT DAYOFWEEK(TIMESTAMP("2012-10-01 02:03:04"));Resi: 2
DAYOFYEAR(<timestamp>)Restituisce il giorno dell'anno di un tipo di dati TIMESTAMP come numero intero compreso tra 1 e 366 inclusi. L'intero 1 si riferisce al 1° gennaio.
Esempio:
SELECT DAYOFYEAR(TIMESTAMP("2012-10-01 02:03:04"));Resi: 275
FORMAT_UTC_USEC(<unix_timestamp>)Restituisce una rappresentazione di stringa leggibile di un timestamp UNIX nel formato
YYYY-MM-DD HH:MM:SS.uuuuuu.Esempio:
SELECT FORMAT_UTC_USEC(1274259481071200);Restituisce: 2010-05-19 08:58:01.071200
HOUR(<timestamp>)Restituisce l'ora di un tipo di dati TIMESTAMP come numero intero compreso tra 0 e 23 inclusi.
Esempio:
SELECT HOUR(TIMESTAMP('2012-10-02 05:23:48'));Resi: 5
MINUTE(<timestamp>)Restituisce i minuti di un tipo di dati TIMESTAMP come numero intero compreso tra 0 e 59 inclusi.
Esempio:
SELECT MINUTE(TIMESTAMP('2012-10-02 05:23:48'));Resi: 23
MONTH(<timestamp>)Restituisce il mese di un tipo di dati TIMESTAMP come numero intero compreso tra 1 e 12 inclusi.
Esempio:
SELECT MONTH(TIMESTAMP('2012-10-02 05:23:48'));Rendimento: 10
MSEC_TO_TIMESTAMP(<expr>)- Converte un timestamp UNIX in millisecondi in un tipo di dati TIMESTAMP.
Esempio:
SELECT MSEC_TO_TIMESTAMP(1349053323000);Restituisce: 2012-10-01 01:02:03 UTC
SELECT MSEC_TO_TIMESTAMP(1349053323000 + 1000)Restituisce: 2012-10-01 01:02:04 UTC
NOW()Restituisce il timestamp UNIX corrente in microsecondi.
Esempio:
SELECT NOW();Resi: 1359685811687920
PARSE_UTC_USEC(<date_string>)-
Converte una stringa di data in un timestamp UNIX in microsecondi.
date_stringdeve avere il formatoYYYY-MM-DD HH:MM:SS[.uuuuuu]. La parte frazionaria del secondo può contenere fino a 6 cifre o può essere omessa.TIMESTAMP_TO_USEC è una funzione equivalente che converte un argomento di tipo di dati TIMESTAMP anziché una stringa di data.
Esempio:
SELECT PARSE_UTC_USEC("2012-10-01 02:03:04");Resi: 1349056984000000
QUARTER(<timestamp>)Restituisce il trimestre dell'anno di un tipo di dati TIMESTAMP come numero intero compreso tra 1 e 4 inclusi.
Esempio:
SELECT QUARTER(TIMESTAMP("2012-10-01 02:03:04"));Resi: 4
SEC_TO_TIMESTAMP(<expr>)Converte un timestamp UNIX in secondi in un tipo di dati TIMESTAMP.
Esempio:
SELECT SEC_TO_TIMESTAMP(1355968987);Restituisce: 2012-12-20 02:03:07 UTC
SELECT SEC_TO_TIMESTAMP(INTEGER(1355968984 + 3));Restituisce: 2012-12-20 02:03:07 UTC
SECOND(<timestamp>)-
Restituisce i secondi di un tipo di dati TIMESTAMP come numero intero compreso tra 0 e 59, inclusi.
Durante un secondo intercalare, l'intervallo di numeri interi è compreso tra 0 e 60, inclusi.
Esempio:
SELECT SECOND(TIMESTAMP('2012-10-02 05:23:48'));Resi: 48
STRFTIME_UTC_USEC(<unix_timestamp>,
<date_format_str>)-
Restituisce una stringa della data leggibile nel formato date_format_str. date_format_str può includere caratteri di punteggiatura correlati alla data (ad esempio / e -) e caratteri speciali accettati dalla funzione strftime in C++ (ad esempio %d per il giorno del mese).
Utilizza le funzioni
UTC_USEC_TO_<function_name>se prevedi di raggruppare i dati delle query per intervalli di tempo, ad esempio per ottenere tutti i dati di un determinato mese, perché le funzioni sono più efficienti.Esempio:
SELECT STRFTIME_UTC_USEC(1274259481071200, "%Y-%m-%d");Resi: 19/05/2010
TIME(<timestamp>)Restituisce una stringa leggibile di un tipo di dati TIMESTAMP nel formato
%H:%M:%S.Esempio:
SELECT TIME(TIMESTAMP('2012-10-01 02:03:04'));Resi: 02:03:04
TIMESTAMP(<date_string>)Converti una stringa di data in un tipo di dati TIMESTAMP.
Esempio:
SELECT TIMESTAMP("2012-10-01 01:02:03");Restituisce: 2012-10-01 01:02:03 UTC
TIMESTAMP_TO_MSEC(<timestamp>)Converte un tipo di dati TIMESTAMP in un timestamp UNIX in millisecondi.
Esempio:
SELECT TIMESTAMP_TO_MSEC(TIMESTAMP("2012-10-01 01:02:03"));Resi: 1349053323000
TIMESTAMP_TO_SEC(<timestamp>)- Converte un tipo di dati TIMESTAMP in un timestamp UNIX in secondi.
Esempio:
SELECT TIMESTAMP_TO_SEC(TIMESTAMP("2012-10-01 01:02:03"));Resi: 1349053323
TIMESTAMP_TO_USEC(<timestamp>)-
Converte un tipo di dati TIMESTAMP in un timestamp UNIX in microsecondi.
PARSE_UTC_USEC è una funzione equivalente che converte un argomento stringa di dati anziché un tipo di dati TIMESTAMP.
Esempio:
SELECT TIMESTAMP_TO_USEC(TIMESTAMP("2012-10-01 01:02:03"));Resi: 1349053323000000
USEC_TO_TIMESTAMP(<expr>)Converte un timestamp UNIX in microsecondi in un tipo di dati TIMESTAMP.
Esempio:
SELECT USEC_TO_TIMESTAMP(1349053323000000);Restituisce: 2012-10-01 01:02:03 UTC
SELECT USEC_TO_TIMESTAMP(1349053323000000 + 1000000)Restituisce: 2012-10-01 01:02:04 UTC
UTC_USEC_TO_DAY(<unix_timestamp>)-
Sposta un timestamp UNIX in microsecondi all'inizio del giorno in cui si verifica.
Ad esempio, se
unix_timestampsi verifica il 19 maggio alle 08:58, questa funzione restituisce un timestamp UNIX per il 19 maggio alle 00:00 (mezzanotte).Esempio:
SELECT UTC_USEC_TO_DAY(1274259481071200);Resi: 1274227200000000
UTC_USEC_TO_HOUR(<unix_timestamp>)-
Sposta un timestamp UNIX in microsecondi all'inizio dell'ora in cui si verifica.
Ad esempio, se
unix_timestampsi verifica alle 08:58, questa funzione restituisce un timestamp UNIX per le 08:00 dello stesso giorno.Esempio:
SELECT UTC_USEC_TO_HOUR(1274259481071200);Resi: 1274256000000000
UTC_USEC_TO_MONTH(<unix_timestamp>)-
Sposta un timestamp UNIX in microsecondi all'inizio del mese in cui si verifica.
Ad esempio, se
unix_timestampsi verifica il 19 marzo, questa funzione restituisce un timestamp Unix per il 1° marzo dello stesso anno.Esempio:
SELECT UTC_USEC_TO_MONTH(1274259481071200);Resi: 1272672000000000
UTC_USEC_TO_WEEK(<unix_timestamp>,
<day_of_week>)-
Restituisce un timestamp UNIX in microsecondi che rappresenta un giorno della settimana dell'argomento
unix_timestamp. Questa funzione accetta due argomenti: un timestamp UNIX in microsecondi e un giorno della settimana da 0 (domenica) a 6 (sabato).Ad esempio, se
unix_timestampsi verifica venerdì 11 aprile 2008 e impostiday_of_weeksu 2 (martedì), la funzione restituisce un timestamp UNIX per martedì 8 aprile 2008.Esempio:
SELECT UTC_USEC_TO_WEEK(1207929480000000, 2) AS tuesday;Resi: 1207612800000000
UTC_USEC_TO_YEAR(<unix_timestamp>)-
Restituisce un timestamp UNIX in microsecondi che rappresenta l'anno dell'argomento
unix_timestamp.Ad esempio, se
unix_timestampsi verifica nel 2010, la funzione restituisce1274259481071200, la rappresentazione in microsecondi di2010-01-01 00:00.Esempio:
SELECT UTC_USEC_TO_YEAR(1274259481071200);Resi: 1262304000000000
WEEK(<timestamp>)Restituisce la settimana di un tipo di dati TIMESTAMP come numero intero compreso tra 1 e 53 inclusi.
Le settimane iniziano di domenica, quindi se il 1° gennaio cade in un giorno diverso da domenica, la settimana 1 ha meno di 7 giorni e la prima domenica dell'anno è il primo giorno della settimana 2.
Esempio:
SELECT WEEK(TIMESTAMP('2014-12-31'));Resi: 53
YEAR(<timestamp>)- Restituisce l'anno di un tipo di dati TIMESTAMP.
Esempio:
SELECT YEAR(TIMESTAMP('2012-10-02 05:23:48'));Ritorno: 2012
Esempi avanzati
-
Convertire i risultati del timestamp intero in un formato leggibile
La seguente query trova i 5 momenti nel tempo in cui sono state apportate il maggior numero di revisioni di Wikipedia. Per visualizzare i risultati in un formato leggibile, utilizza la funzione
FORMAT_UTC_USEC()di BigQuery, che accetta un timestamp, in microsecondi, come input. Questa query moltiplica i timestamp in formato POSIX di Wikipedia (in secondi) per 1.000.000 per convertire il valore in microsecondi.Esempio:
#legacySQL SELECT /* Multiply timestamp by 1000000 and convert */ /* into a more human-readable format. */ TOP (FORMAT_UTC_USEC(timestamp * 1000000), 5) AS top_revision_time, COUNT (*) AS revision_count FROM [bigquery-public-data:samples.wikipedia];
Resi:
+----------------------------+----------------+ | top_revision_time | revision_count | +----------------------------+----------------+ | 2002-02-25 15:51:15.000000 | 20976 | | 2002-02-25 15:43:11.000000 | 15974 | | 2010-02-02 03:34:51.000000 | 3 | | 2010-02-02 01:04:59.000000 | 3 | | 2010-02-01 23:55:05.000000 | 3 | +----------------------------+----------------+
-
Raggruppamento dei risultati per timestamp
È utile utilizzare le funzioni di data e ora per raggruppare i risultati delle query in bucket corrispondenti a determinati anni, mesi o giorni. L'esempio seguente utilizza la funzione
UTC_USEC_TO_MONTH()per mostrare il numero di caratteri utilizzati ogni mese da ciascun collaboratore di Wikipedia nei commenti alle revisioni.Esempio:
#legacySQL SELECT contributor_username, /* Return the timestamp shifted to the * start of the month, formatted in * a human-readable format. Uses the * 'LEFT()' string function to return only * the first 7 characters of the formatted timestamp. */ LEFT (FORMAT_UTC_USEC( UTC_USEC_TO_MONTH(timestamp * 1000000)),7) AS month, SUM(LENGTH(comment)) as total_chars_used FROM [bigquery-public-data:samples.wikipedia] WHERE (contributor_username != '' AND contributor_username IS NOT NULL) AND timestamp > 1133395200 AND timestamp < 1157068800 GROUP BY contributor_username, month ORDER BY total_chars_used DESC;
Resi (troncati):
+--------------------------------+---------+-----------------------+ | contributor_username | month | total_chars_used | +--------------------------------+---------+-----------------------+ | Kingbotk | 2006-08 | 18015066 | | SmackBot | 2006-03 | 7838365 | | SmackBot | 2006-05 | 5148863 | | Tawkerbot2 | 2006-05 | 4434348 | | Cydebot | 2006-06 | 3380577 | etc ...
Funzioni IP
Le funzioni IP convertono gli indirizzi IP in un formato leggibile e viceversa.
Sintassi
| Funzioni IP | |
|---|---|
FORMAT_IP() |
Converte i 32 bit meno significativi di integer_value in una stringa di indirizzo IPv4 leggibile. |
PARSE_IP() |
Converte una stringa che rappresenta l'indirizzo IPv4 in un valore intero non firmato. |
FORMAT_PACKED_IP() |
Restituisce un indirizzo IP leggibile nel formato
10.1.5.23 o 2620:0:1009:1:216:36ff:feef:3f. |
PARSE_PACKED_IP() |
Restituisce un indirizzo IP in BYTES. |
FORMAT_IP(integer_value)- Converte i 32 bit meno significativi di
integer_valuein una stringa di indirizzo IPv4 leggibile. Ad esempio,FORMAT_IP(1)restituirà la stringa'0.0.0.1'. PARSE_IP(readable_ip)- Converte una stringa che rappresenta l'indirizzo IPv4 in un valore intero non firmato. Ad esempio,
PARSE_IP('0.0.0.1')restituirà1. Se la stringa non è un indirizzo IPv4 valido,PARSE_IPrestituiràNULL.
BigQuery supporta la scrittura di indirizzi IPv4 e IPv6 in stringhe compattate, come dati binari di 4 o 16 byte in ordine di byte di rete. Le funzioni descritte di seguito supportano l'analisi degli indirizzi in formato leggibile. Queste funzioni funzionano solo sui campi stringa con indirizzi IP.
Sintassi
FORMAT_PACKED_IP(packed_ip)Restituisce un indirizzo IP leggibile, nel formato
10.1.5.23o2620:0:1009:1:216:36ff:feef:3f. Esempi:-
FORMAT_PACKED_IP('0123456789@ABCDE')restituisce'3031:3233:3435:3637:3839:4041:4243:4445' FORMAT_PACKED_IP('0123')restituisce'48.49.50.51'
-
PARSE_PACKED_IP(readable_ip)Restituisce un indirizzo IP in BYTES. Se la stringa di input non è un indirizzo IPv4 o IPv6 valido,
PARSE_PACKED_IPrestituisceNULL. Esempi:PARSE_PACKED_IP('48.49.50.51')restituisce'MDEyMw=='PARSE_PACKED_IP('3031:3233:3435:3637:3839:4041:4243:4445')restituisce'MDEyMzQ1Njc4OUBBQkNERQ=='
Funzioni JSON
Le funzioni JSON di BigQuery ti consentono di trovare valori all'interno dei dati JSON archiviati utilizzando espressioni simili a JSONPath.
L'archiviazione dei dati JSON può essere più flessibile rispetto alla dichiarazione di tutti i singoli campi nello schema della tabella, ma può comportare costi più elevati. Quando selezioni i dati da una stringa JSON, ti viene addebitato il costo della scansione dell'intera stringa, che è più costosa rispetto a quando ogni campo si trova in una colonna separata. La query è anche più lenta perché l'intera stringa deve essere analizzata al momento della query. Tuttavia, per gli schemi ad hoc o in rapida evoluzione, la flessibilità di JSON può valere il costo aggiuntivo.
Se lavori con dati strutturati, utilizza le funzioni JSON anziché le funzioni di espressioni regolari di BigQuery, perché sono più facili da usare.
Sintassi
| Funzioni JSON | |
|---|---|
JSON_EXTRACT() |
Seleziona un valore in base all'espressione JSONPath e restituisce una stringa JSON. |
JSON_EXTRACT_SCALAR() |
Seleziona un valore in base all'espressione JSONPath e restituisce uno scalare JSON. |
JSON_EXTRACT(json, json_path)-
Seleziona un valore in
jsonin base all'espressione JSONPathjson_path.json_pathdeve essere una costante stringa. Restituisce il valore in formato stringa JSON. JSON_EXTRACT_SCALAR(json, json_path)-
Seleziona un valore in
jsonin base all'espressione JSONPathjson_path.json_pathdeve essere una costante stringa. Restituisce un valore JSON scalare.
Operatori logici
Gli operatori logici eseguono la logica binaria o ternaria sulle espressioni. La logica binaria restituisce true o false. La logica ternaria accetta valori NULL e restituisce true, false o NULL.
Sintassi
| Operatori logici | |
|---|---|
expr AND expr |
Restituisce true se entrambe le espressioni sono vere. |
expr OR expr |
Restituisce true se una o entrambe le espressioni sono vere. |
NOT expr |
Restituisce true se l'espressione è false. |
expr AND expr- Restituisce
truese entrambe le espressioni sono vere. - Restituisce
falsese una o entrambe le espressioni sono false. - Restituisce
NULLse entrambe le espressioni sono NULL o se un'espressione è true e l'altra è NULL.
- Restituisce
expr OR expr- Restituisce
truese una o entrambe le espressioni sono vere. - Restituisce
falsese entrambe le espressioni sono false. - Restituisce
NULLse entrambe le espressioni sono NULL o se un'espressione è false e l'altra è NULL.
- Restituisce
NOT expr- Restituisce
truese l'espressione è false. - Restituisce
falsese l'espressione è true. - Restituisce
NULLse l'espressione è NULL.
Puoi utilizzare
NOTcon altre funzioni come operatore di negazione. Ad esempio:NOT IN(expr1, expr2)oIS NOT NULL.- Restituisce
Funzioni matematiche
Le funzioni matematiche accettano argomenti numerici e restituiscono un risultato numerico. Ogni argomento può essere un valore letterale numerico o un valore numerico restituito da una query. Se la funzione matematica restituisce un risultato indefinito, l'operazione restituisce NULL.
Sintassi
| Funzioni matematiche | |
|---|---|
ABS() |
Restituisce il valore assoluto dell'argomento. |
ACOS() |
Restituisce l'arcocoseno dell'argomento. |
ACOSH() |
Restituisce il coseno iperbolico inverso dell'argomento. |
ASIN() |
Restituisce l'arcoseno dell'argomento. |
ASINH() |
Restituisce l'arcoseno iperbolico dell'argomento. |
ATAN() |
Restituisce l'arcotangente dell'argomento. |
ATANH() |
Restituisce l'arcotangente iperbolica dell'argomento. |
ATAN2() |
Restituisce l'arcotangente dei due argomenti. |
CEIL() |
Arrotonda l'argomento al numero intero più vicino e restituisce il valore arrotondato. |
COS() |
Restituisce il coseno dell'argomento. |
COSH() |
Restituisce il coseno iperbolico dell'argomento. |
DEGREES() |
Converte i radianti in gradi. |
EXP() |
Restituisce e elevato alla potenza dell'argomento. |
FLOOR() |
Arrotonda per difetto l'argomento al numero intero più vicino. |
LN()LOG()
|
Restituisce il logaritmo naturale dell'argomento. |
LOG2() |
Restituisce il logaritmo in base 2 dell'argomento. |
LOG10() |
Restituisce il logaritmo in base 10 dell'argomento. |
PI() |
Restituisce la costante π. |
POW() |
Restituisce il primo argomento elevato alla potenza del secondo argomento. |
RADIANS() |
Converte da gradi a radianti. |
RAND() |
Restituisce un valore in virgola mobile casuale compreso nell'intervallo 0,0 <= valore < 1,0. |
ROUND() |
Arrotonda l'argomento per eccesso o per difetto al numero intero più vicino. |
SIN() |
Restituisce il seno dell'argomento. |
SINH() |
Restituisce il seno iperbolico dell'argomento. |
SQRT() |
Restituisce la radice quadrata dell'espressione. |
TAN() |
Restituisce la tangente dell'argomento. |
TANH() |
Restituisce la tangente iperbolica dell'argomento. |
ABS(numeric_expr)- Restituisce il valore assoluto dell'argomento.
ACOS(numeric_expr)- Restituisce l'arcocoseno dell'argomento.
ACOSH(numeric_expr)- Restituisce il coseno iperbolico inverso dell'argomento.
ASIN(numeric_expr)- Restituisce l'arcoseno dell'argomento.
ASINH(numeric_expr)- Restituisce l'arcoseno iperbolico dell'argomento.
ATAN(numeric_expr)- Restituisce l'arcotangente dell'argomento.
ATANH(numeric_expr)- Restituisce l'arcotangente iperbolica dell'argomento.
ATAN2(numeric_expr1, numeric_expr2)- Restituisce l'arcotangente dei due argomenti.
CEIL(numeric_expr)- Arrotonda l'argomento al numero intero più vicino e restituisce il valore arrotondato.
COS(numeric_expr)- Restituisce il coseno dell'argomento.
COSH(numeric_expr)- Restituisce il coseno iperbolico dell'argomento.
DEGREES(numeric_expr)- Restituisce
numeric_expr, convertito da radianti a gradi. EXP(numeric_expr)- Restituisce il risultato dell'elevamento della costante "e", la base del logaritmo naturale, alla potenza di numeric_expr.
FLOOR(numeric_expr)- Arrotonda per difetto l'argomento al numero intero più vicino e restituisce il valore arrotondato.
LN(numeric_expr)
LOG(numeric_expr)- Restituisce il logaritmo naturale dell'argomento.
LOG2(numeric_expr)- Restituisce il logaritmo in base 2 dell'argomento.
LOG10(numeric_expr)- Restituisce il logaritmo in base 10 dell'argomento.
PI()- Restituisce la costante π. La funzione
PI()richiede le parentesi per indicare che si tratta di una funzione, ma non accetta argomenti tra le parentesi. Puoi utilizzarePI()come una costante con funzioni matematiche e aritmetiche. POW(numeric_expr1, numeric_expr2)- Restituisce il risultato dell'elevamento di
numeric_expr1alla potenza dinumeric_expr2. RADIANS(numeric_expr)- Restituisce
numeric_expr, convertito da gradi a radianti. Tieni presente che π radianti equivalgono a 180 gradi. RAND([int32_seed])- Restituisce un valore float casuale compreso nell'intervallo 0,0 <= valore < 1,0. Ogni valore
int32_seedgenera sempre la stessa sequenza di numeri casuali all'interno di una determinata query, a condizione che non utilizzi una clausolaLIMIT. Seint32_seednon è specificato, BigQuery utilizza il timestamp corrente come valore di inizializzazione. ROUND(numeric_expr [, digits])- Arrotonda l'argomento per eccesso o per difetto al numero intero più vicino (o, se specificato, al numero di cifre specificato) e restituisce il valore arrotondato.
SIN(numeric_expr)- Restituisce il seno dell'argomento.
SINH(numeric_expr)- Restituisce il seno iperbolico dell'argomento.
SQRT(numeric_expr)- Restituisce la radice quadrata dell'espressione.
TAN(numeric_expr)- Restituisce la tangente dell'argomento.
TANH(numeric_expr)- Restituisce la tangente iperbolica dell'argomento.
Esempi avanzati
-
Query del riquadro di delimitazione
La seguente query restituisce una raccolta di punti all'interno di un rettangolo di selezione centrato su San Francisco (37,46, -122,50).
Esempio:
#legacySQL SELECT year, month, AVG(mean_temp) avg_temp, MIN(min_temperature) min_temp, MAX(max_temperature) max_temp FROM [weather_geo.table] WHERE /* Return values between a pair of */ /* latitude and longitude coordinates */ lat / 1000 > 37.46 AND lat / 1000 < 37.65 AND long / 1000 > -122.50 AND long / 1000 < -122.30 GROUP BY year, month ORDER BY year, month ASC;
-
Query del cerchio di delimitazione approssimativo
Restituisce una raccolta di un massimo di 100 punti all'interno di un cerchio approssimativo determinato utilizzando la legge sferica dei coseni, centrato su Denver, Colorado (39,73, -104,98). Questa query utilizza le funzioni matematiche e trigonometriche di BigQuery, come
PI(),SIN()eCOS().Poiché la Terra non è una sfera assoluta e la longitudine e la latitudine convergono ai poli, questa query restituisce un'approssimazione che può essere utile per molti tipi di dati.
Esempio:
#legacySQL SELECT distance, lat, long, temp FROM (SELECT ((ACOS(SIN(39.73756700 * PI() / 180) * SIN((lat/1000) * PI() / 180) + COS(39.73756700 * PI() / 180) * COS((lat/1000) * PI() / 180) * COS((-104.98471790 - (long/1000)) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS distance, AVG(mean_temp) AS temp, AVG(lat/1000) lat, AVG(long/1000) long FROM [weather_geo.table] WHERE month=1 GROUP BY distance) WHERE distance < 100 ORDER BY distance ASC LIMIT 100;
Funzioni di espressioni regolari
BigQuery fornisce il supporto delle espressioni regolari utilizzando la libreria re2. Consulta la documentazione per la sintassi delle espressioni regolari.
Tieni presente che le espressioni regolari sono corrispondenze globali; per iniziare la corrispondenza all'inizio di una parola devi utilizzare il carattere ^.
Sintassi
| Funzioni di espressioni regolari | |
|---|---|
REGEXP_MATCH() |
Restituisce true se l'argomento corrisponde all'espressione regolare. |
REGEXP_EXTRACT() |
Restituisce la parte dell'argomento che corrisponde al gruppo di acquisizione all'interno dell'espressione regolare. |
REGEXP_REPLACE() |
Sostituisce una sottostringa che corrisponde a un'espressione regolare. |
REGEXP_MATCH('str', 'reg_exp')Restituisce true se str corrisponde all'espressione regolare. Per la corrispondenza di stringhe senza espressioni regolari, utilizza CONTAINS anziché REGEXP_MATCH.
Esempio:
#legacySQL SELECT word, COUNT(word) AS count FROM [bigquery-public-data:samples.shakespeare] WHERE (REGEXP_MATCH(word,r'\w\w\'\w\w')) GROUP BY word ORDER BY count DESC LIMIT 3;
Resi:
+-------+-------+ | word | count | +-------+-------+ | ne'er | 42 | | we'll | 35 | | We'll | 33 | +-------+-------+
REGEXP_EXTRACT('str', 'reg_exp')Restituisce la parte di str che corrisponde al gruppo di acquisizione all'interno dell'espressione regolare.
Esempio:
#legacySQL SELECT REGEXP_EXTRACT(word,r'(\w\w\'\w\w)') AS fragment FROM [bigquery-public-data:samples.shakespeare] GROUP BY fragment ORDER BY fragment LIMIT 3;
Resi:
+----------+ | fragment | +----------+ | NULL | | Al'ce | | As'es | +----------+
REGEXP_REPLACE('orig_str', 'reg_exp', 'replace_str')Restituisce una stringa in cui qualsiasi sottostringa di orig_str che corrisponde a reg_exp viene sostituita con replace_str. Ad esempio, REGEXP_REPLACE ('Hello', 'lo', 'p') restituisce Help.
Esempio:
#legacySQL SELECT REGEXP_REPLACE(word, r'ne\'er', 'never') AS expanded_word FROM [bigquery-public-data:samples.shakespeare] WHERE REGEXP_MATCH(word, r'ne\'er') GROUP BY expanded_word ORDER BY expanded_word LIMIT 5;
Resi:
+---------------+ | expanded_word | +---------------+ | Whenever | | never | | nevertheless | | whenever | +---------------+
Esempi avanzati
-
Filtrare il set di risultati in base alla corrispondenza dell'espressione regolare
Le funzioni di espressione regolare di BigQuery possono essere utilizzate per filtrare i risultati in una clausola
WHERE, nonché per visualizzare i risultati inSELECT. L'esempio seguente combina entrambi questi casi d'uso delle espressioni regolari in un'unica query.Esempio:
#legacySQL SELECT /* Replace white spaces in the title with underscores. */ REGEXP_REPLACE(title, r'\s+', '_') AS regexp_title, revisions FROM (SELECT title, COUNT(revision_id) as revisions FROM [bigquery-public-data:samples.wikipedia] WHERE wp_namespace=0 /* Match titles that start with 'G', end with * 'e', and contain at least two 'o's. */ AND REGEXP_MATCH(title, r'^G.*o.*o.*e$') GROUP BY title ORDER BY revisions DESC LIMIT 100);
-
Utilizzo di espressioni regolari su dati interi o in virgola mobile
Sebbene le funzioni di espressioni regolari di BigQuery funzionino solo per i dati stringa, è possibile utilizzare la funzione
STRING()per trasmettere i dati interi o in virgola mobile nel formato stringa. In questo esempio,STRING()viene utilizzato per eseguire il cast del valore interocorpus_datein una stringa, che viene poi modificata daREGEXP_REPLACE.Esempio:
#legacySQL SELECT corpus_date, /* Cast the corpus_date to a string value */ REGEXP_REPLACE(STRING(corpus_date), '^16', 'Written in the sixteen hundreds, in the year \'' ) AS date_string FROM [bigquery-public-data:samples.shakespeare] /* Cast the corpus_date to string, */ /* match values that begin with '16' */ WHERE REGEXP_MATCH(STRING(corpus_date), '^16') GROUP BY corpus_date, date_string ORDER BY date_string DESC LIMIT 5;
Funzioni di stringa
Le funzioni stringa operano sui dati stringa. Le costanti stringa devono essere racchiuse
tra virgolette singole o doppie. Per impostazione predefinita, le funzioni stringa sono sensibili alle maiuscole.
Puoi aggiungere IGNORE CASE alla fine di una query per attivare la corrispondenza senza distinzione tra maiuscole e minuscole. IGNORE CASE funziona solo con i caratteri ASCII
e solo al livello superiore della query.
I caratteri jolly non sono supportati in queste funzioni; per la funzionalità delle espressioni regolari, utilizza le funzioni di espressioni regolari.
Sintassi
| Funzioni di stringa | |
|---|---|
CONCAT() |
Restituisce la concatenazione di due o più stringhe o NULL se uno dei valori è NULL. |
expr CONTAINS 'str' |
Restituisce true se expr contiene l'argomento stringa specificato. |
INSTR() |
Restituisce l'indice in base 1 della prima occorrenza di una stringa. |
LEFT() |
Restituisce i caratteri più a sinistra di una stringa. |
LENGTH() |
Restituisce la lunghezza della stringa. |
LOWER() |
Restituisce la stringa originale con tutti i caratteri in minuscolo. |
LPAD() |
Inserisce caratteri a sinistra di una stringa. |
LTRIM() |
Rimuove i caratteri dal lato sinistro di una stringa. |
REPLACE() |
Sostituisce tutte le occorrenze di una sottostringa. |
RIGHT() |
Restituisce i caratteri più a destra di una stringa. |
RPAD() |
Inserisce caratteri sul lato destro di una stringa. |
RTRIM() |
Rimuove i caratteri finali dal lato destro di una stringa. |
SPLIT() |
Divide una stringa in sottostringhe ripetute. |
SUBSTR() |
Restituisce una sottostringa… |
UPPER() |
Restituisce la stringa originale con tutti i caratteri in maiuscolo. |
CONCAT('str1', 'str2', '...')
str1 + str2 + ...- Restituisce la concatenazione di due o più stringhe o NULL se uno dei valori è NULL. Esempio:se
str1èJavaestr2èScript,CONCATrestituisceJavaScript. expr CONTAINS 'str'- Restituisce
trueseexprcontiene l'argomento stringa specificato. Questo è un confronto sensibile alle maiuscole. INSTR('str1', 'str2')- Restituisce l'indice in base 1 della prima occorrenza di str2 in str1 oppure restituisce 0 se str2 non è presente in str1.
LEFT('str', numeric_expr)- Restituisce i numeric_expr caratteri più a sinistra di
str. Se il numero è più lungo di str, verrà restituita l'intera stringa. Esempio:LEFT('seattle', 3)restituiscesea. LENGTH('str')- Restituisce un valore numerico per la lunghezza della stringa. Esempio: se
strè'123456',LENGTHrestituisce6. LOWER('str')- Restituisce la stringa originale con tutti i caratteri in minuscolo.
LPAD('str1', numeric_expr, 'str2')- Riempie
str1a sinistra constr2, ripetendostr2finché la stringa dei risultati non contiene esattamentenumeric_exprcaratteri. Esempio:LPAD('1', 7, '?')restituisce??????1. LTRIM('str1' [, str2])-
Rimuove i caratteri dal lato sinistro di str1. Se str2 viene omesso,
LTRIMrimuove gli spazi dal lato sinistro di str1. In caso contrario,LTRIMrimuove tutti i caratteri in str2 dal lato sinistro di str1 (rispettando la distinzione tra maiuscole e minuscole).Esempi:
SELECT LTRIM("Say hello", "yaS")restituisce" hello".SELECT LTRIM("Say hello", " ySa")restituisce"hello". REPLACE('str1', 'str2', 'str3')-
Sostituisce tutte le istanze di str2 all'interno di str1 con str3.
RIGHT('str', numeric_expr)- Restituisce i numeric_expr caratteri più a destra di
str. Se il numero è più lungo della stringa, verrà restituita l'intera stringa. Esempio:RIGHT('kirkland', 4)restituisceland. RPAD('str1', numeric_expr, 'str2')- Riempie
str1a destra constr2, ripetendostr2finché la stringa del risultato non contiene esattamentenumeric_exprcaratteri. Esempio:RPAD('1', 7, '?')restituisce1??????. RTRIM('str1' [, str2])-
Rimuove i caratteri finali dal lato destro di str1. Se str2 viene omesso,
RTRIMrimuove gli spazi finali da str1. In caso contrario,RTRIMrimuove tutti i caratteri di str2 dal lato destro di str1 (rispettando la distinzione tra maiuscole e minuscole).Esempi:
SELECT RTRIM("Say hello", "leo")restituisce"Say h".SELECT RTRIM("Say hello ", " hloe")restituisce"Say". SPLIT('str' [, 'delimiter'])- Divide una stringa in sottostringhe ripetute. Se viene specificato
delimiter, la funzioneSPLITsuddividestrin sottostringhe, utilizzandodelimitercome delimitatore. SUBSTR('str', index [, max_len])- Restituisce una sottostringa di
str, a partire daindex. Se viene utilizzato il parametro facoltativomax_len, la stringa restituita ha una lunghezza massima dimax_lencaratteri. Il conteggio inizia da 1, quindi il primo carattere della stringa si trova nella posizione 1 (non zero). Seindexè5, la sottostringa inizia con il quinto carattere da sinistra instr. Seindexè-4, la sottostringa inizia con il quarto carattere da destra instr. Esempio:SUBSTR('awesome', -4, 4)restituisce la sottostringasome. UPPER('str')- Restituisce la stringa originale con tutti i caratteri in maiuscolo.
Interpretazione letterale dei caratteri speciali nelle stringhe
Per eseguire l'escape dei caratteri speciali, utilizza uno dei seguenti metodi:
- Utilizza la notazione
'\xDD', dove'\x'è seguito dalla rappresentazione esadecimale a due cifre del carattere. - Utilizza una barra di escape prima di barre, virgolette singole e virgolette doppie.
- Utilizza sequenze in stile C (
'\a', '\b', '\f', '\n', '\r', '\t',e'\v') per gli altri caratteri.
Alcuni esempi di escape:
'this is a space: \x20'
'this string has \'single quote\' inside it'
'first line \n second line'
"double quotes are also ok"
'\070' -> ERROR: octal escaping is not supported
Funzioni con caratteri jolly nelle tabelle
Le funzioni con caratteri jolly per le tabelle sono un modo pratico per eseguire query sui dati di un insieme specifico di tabelle. Una funzione jolly della tabella equivale a un'unione separata da virgole di tutte le tabelle corrispondenti alla funzione jolly. Quando utilizzi una funzione jolly per le tabelle, BigQuery accede solo alle tabelle che corrispondono al jolly e ti addebita solo quelle. Le funzioni jolly della tabella sono specificate nella clausola FROM della query.
Se utilizzi le funzioni carattere jolly della tabella in una query, non è più necessario racchiuderle tra parentesi. Ad esempio, alcuni degli esempi seguenti utilizzano le parentesi, mentre altri no.
I risultati memorizzati nella cache non sono supportati per le query su più tabelle che utilizzano una funzione jolly (anche se è selezionata l'opzione Utilizza risultati memorizzati nella cache). Se esegui la stessa query con caratteri jolly più volte, ti viene addebitato un importo per ogni query.
Sintassi
| Funzioni con caratteri jolly nelle tabelle | |
|---|---|
TABLE_DATE_RANGE() |
Esegue query su più tabelle giornaliere che coprono un intervallo di date. |
TABLE_DATE_RANGE_STRICT() |
Esegue query su più tabelle giornaliere che coprono un intervallo di date, senza date mancanti. |
TABLE_QUERY() |
Esegue query sulle tabelle i cui nomi corrispondono a un predicato specificato. |
TABLE_DATE_RANGE(prefix, timestamp1, timestamp2)-
Esegue query sulle tabelle giornaliere che si sovrappongono all'intervallo di tempo compreso tra
<timestamp1>e<timestamp2>.I nomi delle tabelle devono avere il seguente formato:
<prefix><day>, dove<day>è nel formatoYYYYMMDD.Puoi utilizzare le funzioni di data e ora per generare i parametri del timestamp. Ad esempio:
TIMESTAMP('2012-10-01 02:03:04')DATE_ADD(CURRENT_TIMESTAMP(), -7, 'DAY')
Esempio: ottenere tabelle tra due giorni
Questo esempio presuppone l'esistenza delle seguenti tabelle:
- mydata.people20140325
- mydata.people20140326
- mydata.people20140327
#legacySQL SELECT name FROM TABLE_DATE_RANGE([myproject-1234:mydata.people], TIMESTAMP('2014-03-25'), TIMESTAMP('2014-03-27')) WHERE age >= 35
Corrisponde alle seguenti tabelle:
- mydata.people20140325
- mydata.people20140326
- mydata.people20140327
Esempio: recuperare le tabelle in un intervallo di due giorni fino a "ora"
Questo esempio presuppone che esistano le seguenti tabelle in un progetto denominato
myproject-1234:- mydata.people20140323
- mydata.people20140324
- mydata.people20140325
#legacySQL SELECT name FROM (TABLE_DATE_RANGE([myproject-1234:mydata.people], DATE_ADD(CURRENT_TIMESTAMP(), -2, 'DAY'), CURRENT_TIMESTAMP())) WHERE age >= 35
Corrisponde alle seguenti tabelle:
- mydata.people20140323
- mydata.people20140324
- mydata.people20140325
TABLE_DATE_RANGE_STRICT(prefix, timestamp1, timestamp2)-
Questa funzione è equivalente a
TABLE_DATE_RANGE. L'unica differenza è che se manca una tabella giornaliera nella sequenza,TABLE_DATE_RANGE_STRICTnon riesce e restituisce un erroreNot Found: Table <table_name>.Esempio: errore relativo alla tabella mancante
Questo esempio presuppone l'esistenza delle seguenti tabelle:
- people20140325
- people20140327
#legacySQL SELECT name FROM (TABLE_DATE_RANGE_STRICT([myproject-1234:mydata.people], TIMESTAMP('2014-03-25'), TIMESTAMP('2014-03-27'))) WHERE age >= 35
L'esempio precedente restituisce l'errore "Not Found" per la tabella "people20140326".
TABLE_QUERY(dataset, expr)-
Esegue query sulle tabelle i cui nomi corrispondono a
exprfornito. Il parametroexprdeve essere rappresentato come una stringa e deve contenere un'espressione da valutare. Ad esempio:'length(table_id) < 3'.Esempio: corrispondenza delle tabelle i cui nomi contengono "oo" e hanno una lunghezza maggiore di 4
Questo esempio presuppone l'esistenza delle seguenti tabelle:
- mydata.boo
- mydata.fork
- mydata.ooze
- mydata.spoon
#legacySQL SELECT speed FROM (TABLE_QUERY([myproject-1234:mydata], 'table_id CONTAINS "oo" AND length(table_id) >= 4'))
Corrisponde alle seguenti tabelle:
- mydata.ooze
- mydata.spoon
Esempio: corrispondenza delle tabelle i cui nomi iniziano con "boo", seguito da 3-5 cifre numeriche
Questo esempio presuppone che esistano le seguenti tabelle in un progetto denominato
myproject-1234:- mydata.book4
- mydata.book418
- mydata.boom12345
- mydata.boom123456789
- mydata.taboo999
#legacySQL SELECT speed FROM TABLE_QUERY([myproject-1234:mydata], 'REGEXP_MATCH(table_id, r"^boo[\d]{3,5}")')
Corrisponde alle seguenti tabelle:
- mydata.book418
- mydata.boom12345
Funzioni URL
Sintassi
| Funzioni URL | |
|---|---|
HOST() |
Dato un URL, restituisce il nome host come stringa. |
DOMAIN() |
Dato un URL, restituisce il dominio come stringa. |
TLD() |
Dato un URL, restituisce il dominio di primo livello più qualsiasi dominio nazionale nell'URL. |
HOST('url_str')- Dato un URL, restituisce il nome host come stringa. Esempio: HOST('http://www.google.com:80/index.html') restituisce 'www.google.com'
DOMAIN('url_str')- Dato un URL, restituisce il dominio come stringa. Esempio: DOMAIN('http://www.google.com:80/index.html') restituisce 'google.com'.
TLD('url_str')- Dato un URL, restituisce il dominio di primo livello più qualsiasi dominio nazionale nell'URL. Esempio: TLD('http://www.google.com:80/index.html') restituisce ".com". TLD('http://www.google.co.uk:80/index.html') restituisce ".co.uk".
Note:
- Queste funzioni non eseguono la ricerca DNS inversa, quindi se le chiami utilizzando un indirizzo IP, restituiranno segmenti dell'indirizzo IP anziché segmenti del nome host.
- Tutte le funzioni di analisi degli URL prevedono caratteri minuscoli. I caratteri maiuscoli nell'URL genereranno un risultato NULL o comunque errato. Se i dati hanno un case misto, valuta la possibilità di passare l'input a questa funzione tramite LOWER().
Esempio avanzato
Analizzare i nomi di dominio dai dati URL
Questa query utilizza la funzione
DOMAIN()
per restituire i domini più popolari elencati come home page dei repository su GitHub. Tieni presente l'utilizzo di HAVING per filtrare i record utilizzando il risultato della funzione DOMAIN(). Questa
è una funzione utile per determinare le informazioni sul referrer dai dati URL.
Esempi:
#legacySQL SELECT DOMAIN(repository_homepage) AS user_domain, COUNT(*) AS activity_count FROM [bigquery-public-data:samples.github_timeline] GROUP BY user_domain HAVING user_domain IS NOT NULL AND user_domain != '' ORDER BY activity_count DESC LIMIT 5;
Resi:
+-----------------+----------------+ | user_domain | activity_count | +-----------------+----------------+ | github.com | 281879 | | google.com | 34769 | | khanacademy.org | 17316 | | sourceforge.net | 15103 | | mozilla.org | 14091 | +-----------------+----------------+
Per esaminare in modo specifico le informazioni sui TLD, utilizza la funzione TLD(). Questo
esempio mostra i domini di primo livello principali che non sono inclusi in un elenco di esempi comuni.
#legacySQL SELECT TLD(repository_homepage) AS user_tld, COUNT(*) AS activity_count FROM [bigquery-public-data:samples.github_timeline] GROUP BY user_tld HAVING /* Only consider TLDs that are NOT NULL */ /* or in our list of common TLDs */ user_tld IS NOT NULL AND NOT user_tld IN ('','.com','.net','.org','.info','.edu') ORDER BY activity_count DESC LIMIT 5;
Resi:
+----------+----------------+ | user_tld | activity_count | +----------+----------------+ | .de | 22934 | | .io | 17528 | | .me | 13652 | | .fr | 12895 | | .co.uk | 9135 | +----------+----------------+
Funzioni finestra
Le funzioni finestra, note anche come funzioni analitiche, consentono di eseguire calcoli su un sottoinsieme specifico, o "finestra", di un insieme di risultati. Le funzioni finestra semplificano la creazione di report che includono analisi complesse come medie mobili e totali parziali.
Ogni funzione finestra richiede una clausola OVER che specifica
la parte superiore e inferiore della finestra. I tre componenti della clausola OVER (partizionamento, ordinamento e framing) forniscono un controllo aggiuntivo
sulla finestra. Il partizionamento consente di dividere i dati di input in
gruppi logici che hanno una caratteristica comune. L'ordinamento ti consente di ordinare i risultati all'interno di una partizione. L'inquadratura consente
di creare un frame di finestra scorrevole all'interno di una partizione che si sposta
rispetto alla riga corrente. Puoi configurare le dimensioni del frame della finestra mobile
in base a un numero di righe o a un intervallo di valori, ad esempio un intervallo di tempo.
#legacySQL SELECT <window_function> OVER ( [PARTITION BY <expr>] [ORDER BY <expr> [ASC | DESC]] [<window-frame-clause>] )
PARTITION BY- Definisce la partizione di base su cui opera questa funzione.
Specifica uno o più nomi di colonne separati da virgole. Verrà creata una partizione per ogni insieme distinto di valori per queste colonne, in modo simile a una clausola
GROUP BY. SePARTITION BYviene omesso, la partizione di base è costituita da tutte le righe dell'input della funzione finestra. - La clausola
PARTITION BYconsente inoltre alle funzioni finestra di partizionare i dati e parallelizzare l'esecuzione. Se vuoi utilizzare una funzione finestra conallowLargeResultso se intendi applicare ulteriori join o aggregazioni all'output della funzione finestra, utilizzaPARTITION BYper parallelizzare l'esecuzione.
Le clausole JOIN EACHeGROUP EACH BYnon possono essere utilizzate nell'output delle funzioni finestra. Per generare risultati di query di grandi dimensioni quando utilizzi le funzioni finestra, devi utilizzarePARTITION BY.ORDER BY- Ordina la partizione. Se
ORDER BYè assente, non è garantito alcun ordinamento predefinito. L'ordinamento avviene a livello di partizione, prima che venga applicata qualsiasi clausola di frame della finestra. Se specifichi una finestraRANGE, devi aggiungere una clausolaORDER BY. L'ordine predefinito èASC. ORDER BYè facoltativo in alcuni casi, ma alcune funzioni finestra, come rank() o dense_rank(), richiedono la clausola.- Se utilizzi
ORDER BYsenza specificareROWSoRANGE,ORDER BYimplica che la finestra si estende dall'inizio della partizione alla riga corrente. In assenza di una clausolaORDER BY, la finestra è l'intera partizione. <window-frame-clause>-
{ROWS | RANGE} {BETWEEN <start> AND <end> | <start> | <end>} - Un sottoinsieme della partizione su cui operare. Può avere le stesse dimensioni
della partizione o essere più piccolo. Se utilizzi
ORDER BYsenza unwindow-frame-clause, il frame della finestra predefinito èRANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW. Se ometti siaORDER BYchewindow-frame-clause, il frame della finestra predefinito è l'intera partizione.ROWS: definisce una finestra in termini di posizione della riga, rispetto alla riga corrente. Ad esempio, per aggiungere una colonna che mostri la somma dei valori salariali delle 5 righe precedenti, devi eseguire una query suSUM(salary) OVER (ROWS BETWEEN 5 PRECEDING AND CURRENT ROW). Il set di righe in genere include la riga corrente, ma non è obbligatorio.RANGE: definisce una finestra in termini di intervallo di valori in una determinata colonna, rispetto al valore della colonna nella riga corrente. Opera solo su numeri e date, dove i valori di data sono numeri interi semplici (microsecondi dall'epoca). Le righe adiacenti con lo stesso valore sono chiamate righe peer. Le righe peer diCURRENT ROWsono incluse in un frame della finestra che specificaCURRENT ROW. Ad esempio, se specifichi la fine della finestra comeCURRENT ROWe la riga successiva nella finestra ha lo stesso valore, verrà inclusa nel calcolo della funzione.BETWEEN <start> AND <end>- Un intervallo, incluse le righe iniziale e finale. L'intervallo non deve includere la riga corrente, ma<start>deve precedere o essere uguale a<end>.<start>: specifica l'offset iniziale per questa finestra, rispetto alla riga corrente. Sono supportate le seguenti opzioni: dove{UNBOUNDED PRECEDING | CURRENT ROW | <expr> PRECEDING | <expr> FOLLOWING}<expr>è un numero intero positivo,PRECEDINGindica un numero di riga o un valore di intervallo precedente eFOLLOWINGindica un numero di riga o un valore di intervallo successivo.UNBOUNDED PRECEDINGindica la prima riga della partizione. Se l'inizio precede la finestra, verrà impostato sulla prima riga della partizione.<end>: specifica l'offset finale per questa finestra, rispetto alla riga corrente. Sono supportate le seguenti opzioni: dove{UNBOUNDED FOLLOWING | CURRENT ROW | <expr> PRECEDING | <expr> FOLLOWING}<expr>è un numero intero positivo,PRECEDINGindica un numero di riga precedente o un valore di intervallo eFOLLOWINGindica un numero di riga successivo o un valore di intervallo.UNBOUNDED FOLLOWINGindica l'ultima riga della partizione. Se la fine è oltre la fine della finestra, verrà impostata sull'ultima riga della partizione.
A differenza delle funzioni di aggregazione, che comprimono molte righe di input in una
riga di output, le funzioni finestra restituiscono una riga di output per ogni riga di input.
Questa funzionalità semplifica la creazione di query che calcolano i totali parziali
e le medie mobili. Ad esempio, la seguente query restituisce un totale parziale
per un piccolo set di dati di cinque righe definito dalle istruzioni SELECT:
#legacySQL SELECT name, value, SUM(value) OVER (ORDER BY value) AS RunningTotal FROM (SELECT "a" AS name, 0 AS value), (SELECT "b" AS name, 1 AS value), (SELECT "c" AS name, 2 AS value), (SELECT "d" AS name, 3 AS value), (SELECT "e" AS name, 4 AS value);
Valore restituito:
+------+-------+--------------+ | name | value | RunningTotal | +------+-------+--------------+ | a | 0 | 0 | | b | 1 | 1 | | c | 2 | 3 | | d | 3 | 6 | | e | 4 | 10 | +------+-------+--------------+
L'esempio seguente calcola una media mobile dei valori nella riga attuale e in quella precedente. La cornice della finestra è composta da due righe che si spostano con la riga corrente.
#legacySQL SELECT name, value, AVG(value) OVER (ORDER BY value ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS MovingAverage FROM (SELECT "a" AS name, 0 AS value), (SELECT "b" AS name, 1 AS value), (SELECT "c" AS name, 2 AS value), (SELECT "d" AS name, 3 AS value), (SELECT "e" AS name, 4 AS value);
Valore restituito:
+------+-------+---------------+ | name | value | MovingAverage | +------+-------+---------------+ | a | 0 | 0.0 | | b | 1 | 0.5 | | c | 2 | 1.5 | | d | 3 | 2.5 | | e | 4 | 3.5 | +------+-------+---------------+
Sintassi
| Funzioni finestra | |
|---|---|
AVG()COUNT(*)COUNT([DISTINCT])MAX()MIN()STDDEV()SUM() |
La stessa operazione delle funzioni di aggregazione corrispondenti, ma calcolata su una finestra definita dalla clausola OVER. |
CUME_DIST() |
Restituisce un valore double che indica la distribuzione cumulativa di un valore in un gruppo di valori… |
DENSE_RANK() |
Restituisce il rango intero di un valore in un gruppo di valori. |
FIRST_VALUE() |
Restituisce il primo valore del campo specificato nella finestra. |
LAG() |
Consente di leggere i dati di una riga precedente all'interno di una finestra. |
LAST_VALUE() |
Restituisce l'ultimo valore del campo specificato nella finestra. |
LEAD() |
Consente di leggere i dati da una riga successiva all'interno di una finestra. |
NTH_VALUE() |
Restituisce il valore di <expr> nella posizione
<n> del frame della finestra ...
|
NTILE() |
Divide la finestra nel numero specificato di bucket. |
PERCENT_RANK() |
Restituisce il ranking della riga corrente rispetto alle altre righe della partizione. |
PERCENTILE_CONT() |
Restituisce un valore interpolato che verrebbe mappato all'argomento percentile rispetto alla finestra ... |
PERCENTILE_DISC() |
Restituisce il valore più vicino al percentile dell'argomento nella finestra. |
RANK() |
Restituisce il rango intero di un valore in un gruppo di valori. |
RATIO_TO_REPORT() |
Restituisce il rapporto tra ciascun valore e la somma dei valori. |
ROW_NUMBER() |
Restituisce il numero di riga corrente del risultato della query nella finestra. |
-
AVG(numeric_expr)
COUNT(*)
COUNT([DISTINCT] field)
MAX(field)
MIN(field)
STDDEV(numeric_expr)
SUM(field)
-
Queste funzioni finestra eseguono la stessa operazione delle corrispondenti
funzioni di aggregazione, ma vengono calcolate
su una finestra definita dalla clausola OVER.
Un'altra differenza significativa è che la funzione
COUNT([DISTINCT] field)produce risultati esatti se utilizzata come funzione finestra, con un comportamento simile alla funzione di aggregazioneEXACT_COUNT_DISTINCT().Nella query di esempio, la clausola
ORDER BYfa sì che la finestra venga calcolata dall'inizio della partizione fino alla riga corrente, il che genera una somma cumulativa per quell'anno.#legacySQL SELECT corpus_date, corpus, word_count, SUM(word_count) OVER ( PARTITION BY corpus_date ORDER BY word_count) annual_total FROM [bigquery-public-data:samples.shakespeare] WHERE word='love' ORDER BY corpus_date, word_count
Resi:
corpus_date corpus word_count annual_total 0 various 37 37 0 sonetti 157 194 1590 2kinghenryvi 18 18 1590 1kinghenryvi 24 42 1590 3kinghenryvi 40 82 CUME_DIST()-
Restituisce un valore double che indica la distribuzione cumulativa di un valore in un gruppo di valori, calcolato utilizzando la formula
<number of rows preceding or tied with the current row> / <total rows>. I valori a parità restituiscono lo stesso valore di distribuzione cumulativa.Questa funzione finestra richiede
ORDER BYnella clausolaOVER.#legacySQL SELECT word, word_count, CUME_DIST() OVER (PARTITION BY corpus ORDER BY word_count DESC) cume_dist, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
Resi:
parola word_count cume_dist fazzoletto 29 0,2 soddisfazione 5 0,4 disappunto 4 0,8 strumenti 4 0,8 circostanza 3 1.0 DENSE_RANK()-
Restituisce il rango intero di un valore in un gruppo di valori. Il ranking viene calcolato in base ai confronti con gli altri valori del gruppo.
I valori a pari merito vengono visualizzati con lo stesso ranking. Il ranking del valore successivo viene incrementato di 1. Ad esempio, se due valori sono a pari merito al secondo posto, il valore successivo in classifica è 3. Se preferisci un intervallo nell'elenco di classificazione, utilizza rank().
Questa funzione finestra richiede
ORDER BYnella clausolaOVER. Resi:#legacySQL SELECT word, word_count, DENSE_RANK() OVER (PARTITION BY corpus ORDER BY word_count DESC) dense_rank, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
parola word_count dense_rank fazzoletto 29 1 soddisfazione 5 2 disappunto 4 3 strumenti 4 3 circostanza 3 4 FIRST_VALUE(<field_name>)-
Restituisce il primo valore di
<field_name>nella finestra. Resi:#legacySQL SELECT word, word_count, FIRST_VALUE(word) OVER (PARTITION BY corpus ORDER BY word_count DESC) fv, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 1
parola word_count fv imperfettamente 1 imperfettamente LAG(<expr>[, <offset>[, <default_value>]])-
Consente di leggere i dati di una riga precedente all'interno di una finestra. Nello specifico,
LAG()restituisce il valore di<expr>per la riga che si trova<offset>righe prima della riga corrente. Se la riga non esiste, viene restituito<default_value>.#legacySQL SELECT word, word_count, LAG(word, 1) OVER (PARTITION BY corpus ORDER BY word_count DESC) lag, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
Resi:
parola word_count attesa fazzoletto 29 null soddisfazione 5 fazzoletto disappunto 4 soddisfazione strumenti 4 disappunto circostanza 3 strumenti LAST_VALUE(<field_name>)-
Restituisce l'ultimo valore di
<field_name>nella finestra.#legacySQL SELECT word, word_count, LAST_VALUE(word) OVER (PARTITION BY corpus ORDER BY word_count DESC) lv, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 1
Resi:
parola word_count lv imperfettamente 1 imperfettamente LEAD(<expr>[, <offset>[, <default_value>]])-
Consente di leggere i dati da una riga successiva all'interno di una finestra. Nello specifico,
LEAD()restituisce il valore di<expr>per la riga che si trova<offset>righe dopo la riga corrente. Se la riga non esiste, viene restituito<default_value>. Resi:#legacySQL SELECT word, word_count, LEAD(word, 1) OVER (PARTITION BY corpus ORDER BY word_count DESC) lead, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
parola word_count lead fazzoletto 29 soddisfazione soddisfazione 5 disappunto disappunto 4 strumenti strumenti 4 circostanza circostanza 3 null NTH_VALUE(<expr>, <n>)-
Restituisce il valore di
<expr>nella posizione<n>del frame della finestra, dove<n>è un indice basato su 1. NTILE(<num_buckets>)-
Divide una sequenza di righe in
<num_buckets>bucket e assegna a ogni riga un numero di bucket corrispondente, come numero intero. La funzionentile()assegna i numeri dei bucket nel modo più uniforme possibile e restituisce un valore compreso tra 1 e<num_buckets>per ogni riga. Resi:#legacySQL SELECT word, word_count, NTILE(2) OVER (PARTITION BY corpus ORDER BY word_count DESC) ntile, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
parola word_count ntile fazzoletto 29 1 soddisfazione 5 1 disappunto 4 1 strumenti 4 2 circostanza 3 2 PERCENT_RANK()-
Restituisce il ranking della riga corrente rispetto alle altre righe della partizione. I valori restituiti sono compresi tra 0 e 1 inclusi. Il primo valore restituito è 0,0.
Questa funzione finestra richiede
ORDER BYnella clausolaOVER. Resi:#legacySQL SELECT word, word_count, PERCENT_RANK() OVER (PARTITION BY corpus ORDER BY word_count DESC) p_rank, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
parola word_count p_rank fazzoletto 29 0.0 soddisfazione 5 0,25 disappunto 4 0,5 strumenti 4 0,5 circostanza 3 1.0 PERCENTILE_CONT(<percentile>)-
Restituisce un valore interpolato che verrebbe mappato all'argomento percentile rispetto alla finestra, dopo averli ordinati in base alla clausola
ORDER BY.<percentile>deve essere compreso tra 0 e 1.Questa funzione finestra richiede
ORDER BYnella clausolaOVER. Resi:#legacySQL SELECT word, word_count, PERCENTILE_CONT(0.5) OVER (PARTITION BY corpus ORDER BY word_count DESC) p_cont, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
parola word_count p_cont fazzoletto 29 4 soddisfazione 5 4 disappunto 4 4 strumenti 4 4 circostanza 3 4 PERCENTILE_DISC(<percentile>)-
Restituisce il valore più vicino al percentile dell'argomento nella finestra.
<percentile>deve essere compreso tra 0 e 1.Questa funzione finestra richiede
ORDER BYnella clausolaOVER. Resi:#legacySQL SELECT word, word_count, PERCENTILE_DISC(0.5) OVER (PARTITION BY corpus ORDER BY word_count DESC) p_disc, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
parola word_count p_disc fazzoletto 29 4 soddisfazione 5 4 disappunto 4 4 strumenti 4 4 circostanza 3 4 RANK()-
Restituisce il rango intero di un valore in un gruppo di valori. Il ranking viene calcolato in base ai confronti con gli altri valori del gruppo.
I valori a pari merito vengono visualizzati con lo stesso ranking. Il rango del valore successivo viene incrementato in base al numero di valori a pari merito che lo precedono. Ad esempio, se due valori sono a pari merito al secondo posto, il valore successivo in classifica è 4, non 3. Se preferisci che non ci siano spazi vuoti nell'elenco di classificazione, utilizza dense_rank().
Questa funzione finestra richiede
ORDER BYnella clausolaOVER. Resi:#legacySQL SELECT word, word_count, RANK() OVER (PARTITION BY corpus ORDER BY word_count DESC) rank, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
parola word_count rank fazzoletto 29 1 soddisfazione 5 2 disappunto 4 3 strumenti 4 3 circostanza 3 5 RATIO_TO_REPORT(<column>)-
Restituisce il rapporto tra ogni valore e la somma dei valori, come numero double compreso tra 0 e 1.
Resi:#legacySQL SELECT word, word_count, RATIO_TO_REPORT(word_count) OVER (PARTITION BY corpus ORDER BY word_count DESC) r_to_r, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
parola word_count r_to_r fazzoletto 29 0,6444444444444445 soddisfazione 5 0,1111111111111111 disappunto 4 0,08888888888888889 strumenti 4 0,08888888888888889 circostanza 3 0.06666666666666667 ROW_NUMBER()-
Restituisce il numero di riga corrente del risultato della query nella finestra, a partire da 1.
Resi:#legacySQL SELECT word, word_count, ROW_NUMBER() OVER (PARTITION BY corpus ORDER BY word_count DESC) row_num, FROM [bigquery-public-data:samples.shakespeare] WHERE corpus='othello' and length(word) > 10 LIMIT 5
parola word_count row_num fazzoletto 29 1 soddisfazione 5 2 disappunto 4 3 strumenti 4 4 circostanza 3 5
Altre funzioni
Sintassi
| Altre funzioni | |
|---|---|
CASE WHEN ... THEN |
Utilizza CASE per scegliere tra due o più espressioni alternative nella query. |
CURRENT_USER() |
Restituisce l'indirizzo email dell'utente che esegue la query. |
EVERY() |
Restituisce true se l'argomento è true per tutti i suoi input. |
FROM_BASE64() |
Converte la stringa di input con codifica base64 nel formato BYTES. |
HASH() |
Calcola e restituisce un valore hash con segno a 64 bit… |
FARM_FINGERPRINT() |
Calcola e restituisce un valore fingerprint con segno a 64 bit… |
IF() |
Se il primo argomento è true, restituisce il secondo argomento; altrimenti restituisce il terzo argomento. |
POSITION() |
Restituisce la posizione sequenziale basata su 1 dell'argomento. |
SHA1() |
Restituisce un hash SHA1 in formato BYTES. |
SOME() |
Restituisce true se l'argomento è true per almeno uno dei suoi input. |
TO_BASE64() |
Converte l'argomento BYTES in una stringa con codifica base64. |
CASE WHEN when_expr1 THEN then_expr1
WHEN when_expr2 THEN then_expr2 ...
ELSE else_expr END- Utilizza CASE per scegliere tra due o più espressioni alternative nella query. Le espressioni WHEN devono essere booleane e tutte le espressioni nelle clausole THEN e nella clausola ELSE devono essere tipi compatibili.
CURRENT_USER()- Restituisce l'indirizzo email dell'utente che esegue la query.
EVERY(<condition>)- Restituisce
trueseconditionè true per tutti i suoi input. Se utilizzata con la clausolaOMIT IF, questa funzione è utile per le query che coinvolgono campi ripetuti. FROM_BASE64(<str>)- Converte la stringa di input con codifica base64
strnel formato BYTES. Per convertire BYTES in una stringa con codifica Base64, utilizza TO_BASE64(). HASH(expr)- Calcola e restituisce un valore hash con segno a 64 bit dei byte di
exprcome definito dalla libreria CityHash (versione 1.0.3). Sono supportate tutte le espressioni di stringhe o numeri interi e la funzione rispettaIGNORE CASEper le stringhe, restituendo valori invarianti rispetto alle maiuscole. FARM_FINGERPRINT(expr)- Calcola e restituisce un valore di impronta digitale con segno a 64 bit dell'input
STRINGoBYTESutilizzando la funzioneFingerprint64della libreria open source FarmHash. L'output di questa funzione per un determinato input non cambierà mai e corrisponde all'output della funzioneFARM_FINGERPRINTquando si utilizza GoogleSQL. RispettaIGNORE CASEper le stringhe, restituendo valori invarianti rispetto alle maiuscole e minuscole. IF(condition, true_return, false_return)- Restituisce
true_returnofalse_return, a seconda checonditionsia true o false. I valori restituiti possono essere valori letterali o derivati da campi, ma devono essere dello stesso tipo di dati. I valori derivati dai campi non devono essere inclusi nella clausolaSELECT. POSITION(field)- Restituisce la posizione sequenziale basata su 1 di field all'interno di un insieme di campi ripetuti.
SHA1(<str>)- Restituisce un hash SHA1, in formato BYTES, della stringa di input
str. Puoi convertire il risultato in base64 utilizzando TO_BASE64(). Ad esempio:#legacySQL SELECT TO_BASE64(SHA1(corpus)) FROM [bigquery-public-data:samples.shakespeare] LIMIT 100;
SOME(<condition>)- Restituisce
trueseconditionè vero per almeno uno dei suoi input. Se utilizzata con la clausolaOMIT IF, questa funzione è utile per le query che coinvolgono campi ripetuti. TO_BASE64(<bin_data>)- Converte l'input BYTES
bin_datain una stringa con codifica base64. Ad esempio: Per convertire una stringa con codifica Base64 in BYTES, utilizza FROM_BASE64().#legacySQL SELECT TO_BASE64(SHA1(title)) FROM [bigquery-public-data:samples.wikipedia] LIMIT 100;
Esempi avanzati
-
Raggruppare i risultati in categorie utilizzando le condizioni
La seguente query utilizza un blocco
CASE/WHENper raggruppare i risultati in categorie "regione" in base a un elenco di stati. Se lo stato non viene visualizzato come opzione in una delle istruzioniWHEN, il valore dello stato verrà impostato su "Nessuno" per impostazione predefinita.Esempio:
#legacySQL SELECT CASE WHEN state IN ('WA', 'OR', 'CA', 'AK', 'HI', 'ID', 'MT', 'WY', 'NV', 'UT', 'CO', 'AZ', 'NM') THEN 'West' WHEN state IN ('OK', 'TX', 'AR', 'LA', 'TN', 'MS', 'AL', 'KY', 'GA', 'FL', 'SC', 'NC', 'VA', 'WV', 'MD', 'DC', 'DE') THEN 'South' WHEN state IN ('ND', 'SD', 'NE', 'KS', 'MN', 'IA', 'MO', 'WI', 'IL', 'IN', 'MI', 'OH') THEN 'Midwest' WHEN state IN ('NY', 'PA', 'NJ', 'CT', 'RI', 'MA', 'VT', 'NH', 'ME') THEN 'Northeast' ELSE 'None' END as region, average_mother_age, average_father_age, state, year FROM (SELECT year, state, SUM(mother_age)/COUNT(mother_age) as average_mother_age, SUM(father_age)/COUNT(father_age) as average_father_age FROM [bigquery-public-data:samples.natality] WHERE father_age < 99 GROUP BY year, state) ORDER BY year LIMIT 5;
Resi:
+--------+--------------------+--------------------+-------+------+ | region | average_mother_age | average_father_age | state | year | +--------+--------------------+--------------------+-------+------+ | South | 24.342600163532296 | 27.683769419460344 | AR | 1969 | | West | 25.185041908446163 | 28.268214055448098 | AK | 1969 | | West | 24.780776677578217 | 27.831181063905248 | CA | 1969 | | West | 25.005834769924412 | 27.942978384829598 | AZ | 1969 | | South | 24.541730952905738 | 27.686430093306885 | AL | 1969 | +--------+--------------------+--------------------+-------+------+
-
Simulare una tabella pivot
Utilizza le istruzioni condizionali per organizzare i risultati di una query secondaria in righe e colonne. Nell'esempio seguente, i risultati di una ricerca degli articoli di Wikipedia più rivisti che iniziano con il valore "Google" sono organizzati in colonne in cui i conteggi delle revisioni sono visualizzati se soddisfano vari criteri.
Esempio:
#legacySQL SELECT page_title, /* Populate these columns as True or False, */ /* depending on the condition */ IF (page_title CONTAINS 'search', INTEGER(total), 0) AS search, IF (page_title CONTAINS 'Earth' OR page_title CONTAINS 'Maps', INTEGER(total), 0) AS geo, FROM /* Subselect to return top revised Wikipedia articles */ /* containing 'Google', followed by additional text. */ (SELECT TOP (title, 5) as page_title, COUNT (*) as total FROM [bigquery-public-data:samples.wikipedia] WHERE REGEXP_MATCH (title, r'^Google.+') AND wp_namespace = 0 );
Resi:
+---------------+--------+------+ | page_title | search | geo | +---------------+--------+------+ | Google search | 4261 | 0 | | Google Earth | 0 | 3874 | | Google Chrome | 0 | 0 | | Google Maps | 0 | 2617 | | Google bomb | 0 | 0 | +---------------+--------+------+
-
Utilizzare HASH per selezionare un campione casuale dei dati
Alcune query possono fornire un risultato utile utilizzando il sottocampionamento casuale del set di risultati. Per recuperare un campionamento casuale di valori, utilizza la funzione
HASHper restituire risultati in cui il modulo "n" dell'hash è uguale a zero.Ad esempio, la seguente query troverà l'
HASH()del valore "title" e poi verificherà se il valore modulo "2" è zero. In questo modo, circa il 50% dei valori dovrebbe essere etichettato come "campionato". Per campionare meno valori, aumenta il valore dell'operazione modulo da "2" a un valore maggiore. La query utilizza la funzioneABSin combinazione conHASH, perchéHASHpuò restituire valori negativi e l'operatore modulo su un valore negativo produce un valore negativo.Esempio:
#legacySQL SELECT title, HASH(title) AS hash_value, IF(ABS(HASH(title)) % 2 == 1, 'True', 'False') AS included_in_sample FROM [bigquery-public-data:samples.wikipedia] WHERE wp_namespace = 0 LIMIT 5;