Prezentare generală a principalelor funcții Google BigQuery — exersați scrierea solicitărilor pentru analiza de marketing

Publicat: 2022-04-12

Cu cât o afacere acumulează mai multe informații, cu atât mai acută este întrebarea unde să le depoziteze. Dacă nu aveți capacitatea sau dorința de a vă întreține propriile servere, Google BigQuery (GBQ) vă poate ajuta. BigQuery oferă stocare rapidă, rentabilă și scalabilă pentru lucrul cu date mari și vă permite să scrieți interogări folosind sintaxa SQL, precum și funcții standard și definite de utilizator.

În acest articol, analizăm principalele funcții ale BigQuery și arătăm posibilitățile acestora folosind exemple specifice. Veți învăța cum să scrieți interogări de bază și să le testați pe date demonstrative.

Creați rapoarte pe datele GBQ fără pregătire tehnică sau cunoștințe de SQL.

Aveți în mod regulat nevoie de rapoarte privind campaniile publicitare, dar nu aveți timp să studiați SQL sau să așteptați un răspuns de la analiștii dvs.? Cu OWOX BI, puteți crea rapoarte fără a fi nevoie să înțelegeți cum sunt structurate datele dvs. Doar selectați parametrii și valorile pe care doriți să le vedeți în raportul de date inteligente. OWOX BI Smart Data va vizualiza instantaneu datele dvs. într-un mod pe care îl puteți înțelege.

ÎNCERCAȚI OWOX BI GRATUIT

Cuprins

  • Ce este SQL și ce dialecte acceptă BigQuery
  • Unde să încep
  • Funcții Google BigQuery
  • Funcții agregate
  • Funcții de dată
  • Funcții șiruri
  • Funcțiile ferestrei
  • Concluzii

Ce este SQL și ce dialecte acceptă BigQuery

Structured Query Language (SQL) vă permite să preluați date din, să adăugați date și să modificați datele în matrice mari. Google BigQuery acceptă două dialecte SQL: SQL standard și SQL învechit.

Ce dialect să alegeți depinde de preferințele dvs., dar Google recomandă utilizarea standardului SQL pentru aceste beneficii:

  • Flexibilitate și funcționalitate pentru câmpuri imbricate și repetate
  • Suport pentru limbajele DML și DDL, permițându-vă să modificați datele din tabele, precum și să gestionați tabelele și vizualizările în GBQ
  • Procesare mai rapidă a cantităților mari de date în comparație cu Legacy SQL
  • Asistență pentru toate actualizările viitoare BigQuery

Puteți afla mai multe despre diferențele de dialect în documentația BigQuery.

Vezi și: Care sunt avantajele noului dialect SQL standard al Google BigQuery față de Legacy SQL și ce sarcini de afaceri poți rezolva cu acesta?

CITEȘTE ARTICOLUL

În mod implicit, interogările Google BigQuery rulează pe Legacy SQL.

Puteți trece la SQL standard în mai multe moduri:

  1. În interfața BigQuery, în fereastra de editare a interogărilor, selectați Afișare opțiuni și eliminați bifa de lângă Utilizare SQL moștenit :
Interfață BigQuery
  1. Înainte de a interoga, adăugați linia #standardSQL și începeți interogarea cu o linie nouă:
adăugați linia #standardSQL

Unde să încep

Pentru a putea exersa și a rula interogări cu noi, am pregătit un tabel cu date demonstrative. Completează formularul de mai jos și ți-l vom trimite prin e-mail.

bonus pentru cititori

Date demonstrative pentru practica interogărilor SQL

Descărcați acum

Pentru a începe, descărcați tabelul de date demonstrativ și încărcați-l în proiectul dvs. Google BigQuery. Cel mai simplu mod de a face acest lucru este cu ajutorul suplimentului OWOX BI BigQuery Reports.

  1. Deschideți Google Sheets și instalați suplimentul OWOX BI BigQuery Reports.
  2. Deschideți tabelul pe care l-ați descărcat care conține date demonstrative și selectați Rapoarte OWOX BI BigQuery –> Încărcați date în BigQuery :
Rapoarte OWOX BI BigQuery
  1. În fereastra care se deschide, alegeți proiectul dvs. Google BigQuery, un set de date și gândiți-vă un nume pentru tabelul în care vor fi stocate datele încărcate.
  2. Specificați un format pentru datele încărcate (după cum se arată în captura de ecran):
masa demo

Dacă nu aveți un proiect în Google BigQuery, creați unul. Pentru a face acest lucru, veți avea nevoie de un cont de facturare activ în Google Cloud Platform. Nu lăsați să vă sperie că trebuie să conectați un card bancar: nu veți fi taxat cu nimic fără să știți. În plus, atunci când vă înregistrați, veți primi 300 USD pentru 12 luni pe care îi puteți cheltui pe stocarea și procesarea datelor.

OWOX BI vă ajută să combinați datele din diferite sisteme în BigQuery: date despre acțiunile utilizatorilor pe site-ul dvs. web, apeluri, comenzi din CRM, e-mailuri, costuri de publicitate. Puteți utiliza OWOX BI pentru a personaliza analizele avansate și pentru a automatiza rapoartele de orice complexitate.

OBȚINE UN DEMO

Înainte de a vorbi despre funcțiile Google BigQuery, să ne amintim cum arată interogările de bază atât în ​​dialectele Legacy SQL, cât și în Standard SQL:

Interogare SQL moștenit SQL standard
Selectați câmpuri din tabel SELECTează câmpul 1, câmpul 2 SELECTează câmpul 1, câmpul 2
Selectați un tabel din care să alegeți câmpurile DE LA [projectID:dataSet.tableName] DIN `projectID.dataSet.tableName`
Selectați parametrul după care să filtrați valorile WHERE câmp 1=valoare WHERE câmp​1​=valoare
Selectați câmpurile după care să grupați rezultatele GROUP BY câmpul 1, câmpul 2 GROUP BY câmpul 1, câmpul 2
Selectați cum să comandați rezultatele ORDER BY câmpul 1 ASC (crescător) sau DESC (descrescător) ORDER BY câmpul 1 ASC (crescător) sau DESC (descrescător)

Funcții Google BigQuery

Când construiți interogări, veți folosi cel mai frecvent funcțiile de agregare, dată, șir și fereastră. Să aruncăm o privire mai atentă la fiecare dintre aceste grupuri de funcții.

Vedeți și: Cum să începeți să lucrați cu stocarea în cloud — creați un set de date și tabele și configurați importarea datelor în Google BigQuery.

CITEȘTE ARTICOLUL

Funcții agregate

Funcțiile agregate oferă valori rezumative pentru un întreg tabel. De exemplu, le puteți folosi pentru a calcula mărimea medie a cecului sau venitul total pe lună sau le puteți utiliza pentru a selecta segmentul de utilizatori care au făcut numărul maxim de achiziții.

Acestea sunt cele mai populare funcții agregate:

SQL moștenit SQL standard Ce face funcția
AVG(câmp) AVG([DIstinct] (câmp)) Returnează valoarea medie a coloanei câmpului. În SQL standard, când adăugați o condiție DISTINCT, media este luată în considerare numai pentru rândurile cu valori unice (nerepetabile) în coloana câmpului.
MAX(câmp) MAX(câmp) Returnează valoarea maximă din coloana câmpului.
MIN(câmp) MIN(câmp) Returnează valoarea minimă din coloana câmpului.
SUM(câmp) SUM(câmp) Returnează suma valorilor din coloana câmpului.
COUNT(câmp) COUNT(câmp) Returnează numărul de rânduri din coloana câmpului.
EXACT_COUNT_DISTINCT(câmp) COUNT([DIstinct] (câmp)) Returnează numărul de rânduri unice din coloana câmpului.

Pentru o listă a tuturor funcțiilor agregate, consultați documentația Legacy SQL și Standard SQL.

Să ne uităm la datele demonstrative pentru a vedea cum funcționează aceste funcții. Putem calcula venitul mediu pentru tranzacții, achizițiile pentru sumele cele mai mari și cele mai mici, venitul total, tranzacțiile totale și numărul de tranzacții unice (pentru a verifica dacă achizițiile au fost duplicate). Pentru a face acest lucru, vom scrie o interogare în care vom specifica numele proiectului nostru Google BigQuery, setul de date și tabelul.

#moștenire SQL

    SELECT AVG(revenue) as average_revenue, MAX(revenue) as max_revenue, MIN(revenue) as min_revenue, SUM(revenue) as whole_revenue, COUNT(transactionId) as transactions, EXACT_COUNT_DISTINCT(transactionId) as unique_transactions FROM [owox-analytics:t_kravchenko.Demo_data]
SELECT AVG(revenue) as average_revenue, MAX(revenue) as max_revenue, MIN(revenue) as min_revenue, SUM(revenue) as whole_revenue, COUNT(transactionId) as transactions, EXACT_COUNT_DISTINCT(transactionId) as unique_transactions FROM [owox-analytics:t_kravchenko.Demo_data]

#SQL standard

    SELECT AVG(revenue) as average_revenue, MAX(revenue) as max_revenue, MIN(revenue) as min_revenue, SUM(revenue) as whole_revenue, COUNT(transactionId) as transactions, COUNT(DISTINCT(transactionId)) as unique_transactions FROM `owox-analytics.t_kravchenko.Demo_data`
SELECT AVG(revenue) as average_revenue, MAX(revenue) as max_revenue, MIN(revenue) as min_revenue, SUM(revenue) as whole_revenue, COUNT(transactionId) as transactions, COUNT(DISTINCT(transactionId)) as unique_transactions FROM `owox-analytics.t_kravchenko.Demo_data`

Ca rezultat, vom obține următoarele:

rezultate

Puteți verifica rezultatele acestor calcule în tabelul inițial cu date demonstrative utilizând funcțiile standard Google Sheets (SUMA, AVG și altele) sau folosind tabele pivot.

După cum puteți vedea din captura de ecran de mai sus, numărul de tranzacții și tranzacții unice este diferit. Aceasta sugerează că există două tranzacții în tabelul nostru cu același ID tranzacție:

ID-ul de tranzacție

Dacă sunteți interesat de tranzacții unice, utilizați o funcție care numără șiruri unice. Alternativ, puteți grupa datele folosind funcția GROUP BY pentru a scăpa de duplicatele înainte de a aplica funcția de agregare.

bonus pentru cititori

Date demonstrative pentru practica interogărilor SQL

Descărcați acum

Funcții de dată

Aceste funcții vă permit să procesați datele: schimbați formatul acestora, selectați câmpul necesar (zi, lună sau an) sau schimbați data cu un anumit interval.

Ele pot fi utile atunci când:

  • conversia datelor și orelor din surse diferite într-un singur format pentru a configura analize avansate
  • crearea de rapoarte actualizate automat sau declanșarea e-mailurilor (de exemplu, când aveți nevoie de date pentru ultimele două ore, săptămână sau lună)
  • crearea de rapoarte de cohortă în care este necesar să se obțină date pentru o perioadă de zile, săptămâni sau luni

Acestea sunt cele mai frecvent utilizate funcții de dată:

SQL moștenit SQL standard Descrierea funcției
DATA CURENTA() DATA CURENTA() Returnează data curentă în formatul % AAAA -% LL-% ZZ.
DATE(marca temporală) DATE(marca temporală) Convertește data din formatul % AAAA -% LL-% ZZ% H:% M:% C. în formatul % AAAA -% LL-% ZZ.
DATE_ADD(marca temporală, interval, interval_units) DATE_ADD(marca temporală, INTERVAL interval interval_units) Returnează data marcajului de timp, crescând-o cu intervalul specificat interval.interval_units. În Legacy SQL, poate lua valorile YEAR, MONTH, DAY, HOUR, MINUTE și SECOND, iar în Standard SQL poate lua YEAR, QUARTER, MONTH, SĂPTĂMÂNĂ și ZI.
DATE_ADD(marca temporală, - interval, unități_interval) DATE_SUB(marca temporală, INTERVAL interval interval_units) Returnează data marcajului de timp, scăzând-o cu intervalul specificat.
DATEDIFF(timestamp1, timestamp2) DATE_DIFF(timestamp1, timestamp2, data_part) Returnează diferența dintre datele timestamp1 și timestamp2. În Legacy SQL, returnează diferența în zile, iar în Standard SQL, returnează diferența în funcție de valoarea specificată date_part (zi, săptămână, lună, trimestru, an).
DAY (marca temporală) EXTRACT(DAY FROM marca temporală) Returnează ziua de la data marcajului de timp. Ia valori de la 1 la 31 inclusiv.
MONTH(marca temporală) EXTRACT(LUNA FROM marcaj temporal) Returnează numărul de secvență al lunii de la data marcajului de timp. Ia valori de la 1 la 12 inclusiv.
AN (marca temporală) EXTRACT(YEAR FROM marca temporală) Returnează anul de la data marcajului de timp.

Pentru o listă a tuturor funcțiilor de dată, consultați documentația Legacy SQL și Standard SQL.

Să aruncăm o privire la datele noastre demonstrative pentru a vedea cum funcționează fiecare dintre aceste funcții. De exemplu, vom obține data curentă, vom transforma data din tabelul original în formatul % YYYY -% LL-% ZZ, o vom elimina și vom adăuga o zi. Apoi vom calcula diferența dintre data curentă și data din tabelul sursă și vom împărți data curentă în câmpuri separate pentru an, lună și zi. Pentru a face acest lucru, puteți copia exemplele de interogări de mai jos și puteți înlocui numele proiectului, setul de date și tabelul de date cu propriile dvs.

#moștenire SQL

    SELECT CURRENT_DATE() AS today, DATE( date_UTC ) AS date_UTC_in_YYYYMMDD, DATE_ADD( date_UTC,1, 'DAY') AS date_UTC_plus_one_day, DATE_ADD( date_UTC,-1, 'DAY') AS date_UTC_minus_one_day, DATEDIFF(CURRENT_DATE(), date_UTC ) AS difference_between_date, DAY( CURRENT_DATE() ) AS the_day, MONTH( CURRENT_DATE()) AS the_month, YEAR( CURRENT_DATE()) AS the_year FROM [owox-analytics:t_kravchenko.Demo_data]
SELECT CURRENT_DATE() AS today, DATE( date_UTC ) AS date_UTC_in_YYYYMMDD, DATE_ADD( date_UTC,1, 'DAY') AS date_UTC_plus_one_day, DATE_ADD( date_UTC,-1, 'DAY') AS date_UTC_minus_one_day, DATEDIFF(CURRENT_DATE(), date_UTC ) AS difference_between_date, DAY( CURRENT_DATE() ) AS the_day, MONTH( CURRENT_DATE()) AS the_month, YEAR( CURRENT_DATE()) AS the_year FROM [owox-analytics:t_kravchenko.Demo_data]

#SQL standard

    SELECT today, date_UTC_in_YYYYMMDD, DATE_ADD( date_UTC_in_YYYYMMDD, INTERVAL 1 DAY) AS date_UTC_plus_one_day, DATE_SUB( date_UTC_in_YYYYMMDD,INTERVAL 1 DAY) AS date_UTC_minus_one_day, DATE_DIFF(today, date_UTC_in_YYYYMMDD, DAY) AS difference_between_date, EXTRACT(DAY FROM today ) AS the_day, EXTRACT(MONTH FROM today ) AS the_month, EXTRACT(YEAR FROM today ) AS the_year FROM ( SELECT CURRENT_DATE() AS today, DATE( date_UTC ) AS date_UTC_in_YYYYMMDD FROM `owox-analytics.t_kravchenko.Demo_data`)
SELECT today, date_UTC_in_YYYYMMDD, DATE_ADD( date_UTC_in_YYYYMMDD, INTERVAL 1 DAY) AS date_UTC_plus_one_day, DATE_SUB( date_UTC_in_YYYYMMDD,INTERVAL 1 DAY) AS date_UTC_minus_one_day, DATE_DIFF(today, date_UTC_in_YYYYMMDD, DAY) AS difference_between_date, EXTRACT(DAY FROM today ) AS the_day, EXTRACT(MONTH FROM today ) AS the_month, EXTRACT(YEAR FROM today ) AS the_year FROM ( SELECT CURRENT_DATE() AS today, DATE( date_UTC ) AS date_UTC_in_YYYYMMDD FROM `owox-analytics.t_kravchenko.Demo_data`)

După rularea interogării, veți primi acest raport:

raport

Vedeți și: Exemple de rapoarte care pot fi create folosind interogări SQL pe date din Google BigQuery și ce valori unice puteți completa datele Google Analytics cu OWOX BI.

CITEȘTE ARTICOLUL

Funcții șiruri

Funcțiile șir vă permit să generați un șir, să selectați și să înlocuiți subșiruri și să calculați lungimea unui șir și secvența de index a subșirului din șirul original. De exemplu, cu funcții șir, puteți:

  • filtrați un raport cu etichete UTM care sunt transmise la adresa URL a paginii
  • aduceți datele într-un singur format dacă numele sursei și campaniei sunt scrise în registre diferite
  • înlocuiți datele incorecte dintr-un raport (de exemplu, dacă numele campaniei este tipărit greșit)

Acestea sunt cele mai populare funcții pentru lucrul cu șiruri:

SQL moștenit SQL standard Descrierea funcției
CONCAT('str1', 'str2') sau 'str1'+ 'str2' CONCAT('str1', 'str2') Concatenează „str1” și „str2” într-un singur șir.
„str1” CONTINE „str2” REGEXP_CONTAINS('str1', 'str2') sau 'str1' LIKE '%str2%' Returnează adevărat dacă șirul „str1” conține șirul „str2”. În SQL standard, șirul „str2” poate fi scris ca o expresie obișnuită folosind biblioteca re2 .
LENGTH('str' ) CHAR_LENGTH('str' )sau CHARACTER_LENGTH('str' ) Returnează lungimea șirului „str” (număr de caractere).
SUBSTR('str', index [, max_len]) SUBSTR('str', index [, max_len]) Returnează un subșir de lungime max_len care începe cu un caracter index din șirul „str”.
LOWER('str') LOWER('str') Convertește toate caracterele din șirul „str în minuscule.
SUS (str) SUS (str) Convertește toate caracterele din șirul „str” în majuscule.
INSTR('str1', 'str2') STRPOS('str1', 'str2') Returnează indexul primei apariții a șirului „str2” la șirul „str1”; în caz contrar, returnează 0.
REPLACE('str1', 'str2', 'str3') REPLACE('str1', 'str2', 'str3') Înlocuiește „str1” cu „str2” cu „str3”.

Puteți afla mai multe despre toate funcțiile șir în documentația Legacy SQL și Standard SQL.

Să ne uităm la datele demonstrative pentru a vedea cum să folosiți funcțiile descrise. Să presupunem că avem trei coloane separate care conțin valori ale zilei, lunii și anului:

masa demo

Lucrul cu o dată în acest format nu este foarte convenabil, așa că putem combina valorile într-o singură coloană. Pentru a face acest lucru, utilizați interogările SQL de mai jos și nu uitați să înlocuiți numele proiectului, al setului de date și al tabelului în Google BigQuery.

#moștenire SQL

    SELECT CONCAT(the_day,'-',the_month,'-',the_year) AS mix_string1 FROM ( SELECT 31 AS the_day, 12 AS the_month, 2018 AS the_year FROM [owox-analytics:t_kravchenko.Demo_data]) GROUP BY mix_string1
SELECT CONCAT(the_day,'-',the_month,'-',the_year) AS mix_string1 FROM ( SELECT 31 AS the_day, 12 AS the_month, 2018 AS the_year FROM [owox-analytics:t_kravchenko.Demo_data]) GROUP BY mix_string1

#SQL standard

    SELECT CONCAT(the_day,'-',the_month,'-',the_year) AS mix_string1 FROM ( SELECT 31 AS the_day, 12 AS the_month, 2018 AS the_year FROM owox-analytics.t_kravchenko.Demo_data) GROUP BY mix_string1
SELECT CONCAT(the_day,'-',the_month,'-',the_year) AS mix_string1 FROM ( SELECT 31 AS the_day, 12 AS the_month, 2018 AS the_year FROM owox-analytics.t_kravchenko.Demo_data) GROUP BY mix_string1

După rularea interogării, primim data într-o coloană:

masa demo

Adesea, atunci când descărcați o pagină de pe un site web, adresa URL înregistrează valorile variabilelor alese de utilizator. Aceasta poate fi o metodă de plată sau de livrare, numărul tranzacției, indexul magazinului fizic în care cumpărătorul dorește să ridice articolul etc. Folosind o interogare SQL, puteți selecta acești parametri din adresa paginii. Luați în considerare două exemple despre cum și de ce ați putea face acest lucru.

Exemplul 1 . Să presupunem că vrem să știm numărul de achiziții în care utilizatorii ridică mărfuri din magazinele fizice. Pentru a face acest lucru, trebuie să calculăm numărul de tranzacții trimise de la paginile din adresa URL care conțin un subșir shop_id (un index pentru un magazin fizic). Putem face acest lucru cu următoarele interogări:

#moștenire SQL

    SELECT COUNT(transactionId) AS transactions, check FROM ( SELECT transactionId, page CONTAINS 'shop_id' AS check FROM [owox-analytics:t_kravchenko.Demo_data]) GROUP BY check
SELECT COUNT(transactionId) AS transactions, check FROM ( SELECT transactionId, page CONTAINS 'shop_id' AS check FROM [owox-analytics:t_kravchenko.Demo_data]) GROUP BY check

#SQL standard

    SELECT COUNT(transactionId) AS transactions, check1, check2 FROM ( SELECT transactionId, REGEXP_CONTAINS( page, 'shop_id') AS check1, page LIKE '%shop_id%' AS check2 FROM `owox-analytics.t_kravchenko.Demo_data`) GROUP BY check1, check2
SELECT COUNT(transactionId) AS transactions, check1, check2 FROM ( SELECT transactionId, REGEXP_CONTAINS( page, 'shop_id') AS check1, page LIKE '%shop_id%' AS check2 FROM `owox-analytics.t_kravchenko.Demo_data`) GROUP BY check1, check2

Din tabelul rezultat, vedem că 5502 tranzacții (verificare = adevărat) au fost trimise din pagini care conțin shop_id:

masa demo

Exemplul 2 . Ați atribuit un delivery_id fiecărei metode de livrare și specificați valoarea acestui parametru în adresa URL a paginii. Pentru a afla ce metodă de livrare a ales utilizatorul, trebuie să selectați delivery_id într-o coloană separată.

Putem folosi următoarele interogări pentru aceasta:

#moștenire SQL

    SELECT page_lower_case, page_length, index_of_delivery_id, selected_delivery_id, REPLACE(selected_delivery_id, 'selected_delivery_id=', '') as delivery_id FROM ( SELECT page_lower_case, page_length, index_of_delivery_id, SUBSTR(page_lower_case, index_of_delivery_id) AS selected_delivery_id FROM ( SELECT page_lower_case, LENGTH(page_lower_case) AS page_length, INSTR(page_lower_case, 'selected_delivery_id') AS index_of_delivery_id FROM ( SELECT LOWER( page) AS page_lower_case, UPPER( page) AS page_upper_case FROM [owox-analytics:t_kravchenko.Demo_data]))) ORDER BY page_lower_case ASC
SELECT page_lower_case, page_length, index_of_delivery_id, selected_delivery_id, REPLACE(selected_delivery_id, 'selected_delivery_id=', '') as delivery_id FROM ( SELECT page_lower_case, page_length, index_of_delivery_id, SUBSTR(page_lower_case, index_of_delivery_id) AS selected_delivery_id FROM ( SELECT page_lower_case, LENGTH(page_lower_case) AS page_length, INSTR(page_lower_case, 'selected_delivery_id') AS index_of_delivery_id FROM ( SELECT LOWER( page) AS page_lower_case, UPPER( page) AS page_upper_case FROM [owox-analytics:t_kravchenko.Demo_data]))) ORDER BY page_lower_case ASC

#SQL standard

    SELECT page_lower_case, page_length, index_of_delivery_id, selected_delivery_id, REPLACE(selected_delivery_id, 'selected_delivery_id=', '') AS delivery_id FROM ( SELECT page_lower_case, page_length, index_of_delivery_id, SUBSTR(page_lower_case, index_of_delivery_id) AS selected_delivery_id FROM ( SELECT page_lower_case, CHAR_LENGTH(page_lower_case) AS page_length, STRPOS(page_lower_case, 'selected_delivery_id') AS index_of_delivery_id FROM ( SELECT LOWER( page) AS page_lower_case, UPPER( page) AS page_upper_case FROM `owox-analytics.t_kravchenko.Demo_data`))) ORDER BY page_lower_case ASC
SELECT page_lower_case, page_length, index_of_delivery_id, selected_delivery_id, REPLACE(selected_delivery_id, 'selected_delivery_id=', '') AS delivery_id FROM ( SELECT page_lower_case, page_length, index_of_delivery_id, SUBSTR(page_lower_case, index_of_delivery_id) AS selected_delivery_id FROM ( SELECT page_lower_case, CHAR_LENGTH(page_lower_case) AS page_length, STRPOS(page_lower_case, 'selected_delivery_id') AS index_of_delivery_id FROM ( SELECT LOWER( page) AS page_lower_case, UPPER( page) AS page_upper_case FROM `owox-analytics.t_kravchenko.Demo_data`))) ORDER BY page_lower_case ASC

Ca rezultat, obținem un tabel ca acesta în Google BigQuery:

masa demo
bonus pentru cititori

Date demonstrative pentru practica interogărilor SQL

Descărcați acum

Funcțiile ferestrei

Aceste funcții sunt similare cu funcțiile agregate pe care le-am discutat mai sus. Principala diferență este că funcțiile ferestrei nu efectuează calcule pe întregul set de date selectat folosind interogarea, ci doar pe o parte a acestor date - un subset sau o fereastră .

Folosind funcțiile ferestre, puteți agrega date într-o secțiune de grup fără a utiliza funcția JOIN pentru a combina mai multe interogări. De exemplu, puteți calcula venitul mediu pe campanie publicitară sau numărul de tranzacții pe dispozitiv. Adăugând un alt câmp în raport, puteți afla cu ușurință, de exemplu, ponderea veniturilor dintr-o campanie publicitară de Black Friday sau ponderea tranzacțiilor efectuate dintr-o aplicație mobilă.

Împreună cu fiecare funcție din interogare, trebuie să scrieți expresia OVER care definește limitele ferestrei. OVER conține trei componente cu care puteți lucra:

  • PARTITION BY — Definește caracteristica prin care împărțiți datele originale în subseturi, cum ar fi clientId sau DayTime
  • ORDER BY — Definește ordinea rândurilor dintr-un subset, cum ar fi ora DESC
  • WINDOW FRAME — Vă permite să procesați rânduri dintr-un subset al unei anumite caracteristici (de exemplu, numai cele cinci rânduri dinaintea rândului curent)

În acest tabel, am colectat cele mai frecvent utilizate funcții de fereastră:

SQL moștenit SQL standard Descrierea funcției
AVG(câmp)
COUNT(câmp)
COUNT(câmp DISTINCT)
MAX()
MIN()
SUMĂ()
AVG([DIstinct] (câmp))
COUNT(câmp)
COUNT([DIstinct] (câmp))
MAX(câmp)
MIN(câmp)
SUM(câmp)
Returnează valoarea medie, număr, maxim, minim și total din coloana câmpului din subsetul selectat. DISTINCT este folosit pentru a calcula numai valori unice (nerepetabile).
DENSE_RANK() DENSE_RANK() Returnează numărul rândului dintr-un subset.
FIRST_VALUE(câmp) FIRST_VALUE (câmp[{RESPECT | IGNORE} NULLS]) Returnează valoarea primului rând din coloana câmpului dintr-un subset. În mod implicit, rândurile cu valori goale din coloana câmpului sunt incluse în calcul. RESPECT sau IGNORE NULLS specifică dacă să includă sau să ignore șirurile NULL.
LAST_VALUE(câmp) LAST_VALUE (câmpul [{RESPECT | IGNORE} NULLS]) Returnează valoarea ultimului rând dintr-un subset din coloana câmpului. În mod implicit, rândurile cu valori goale în coloana câmpului sunt incluse în calcul. RESPECT sau IGNORE NULLS specifică dacă să includă sau să ignore șirurile NULL.
LAG(câmp) LAG (câmp[, offset [, expresie_default]]) Returnează valoarea rândului anterior în raport cu coloana câmpului curent din subsetul. Decalajul este un număr întreg care specifică numărul de rânduri de compensat în jos față de rândul curent. Expresia_default este valoarea pe care funcția o va returna dacă nu este necesar. șir din submulțiune.
LEAD(câmp) LEAD (câmp[, offset [, expresie_default]]) Returnează valoarea rândului următor în raport cu coloana câmpului curent din subsetul. Offset este un număr întreg care definește numărul de rânduri pe care doriți să le mutați în sus față de rândul curent. Default_expression este valoarea pe care funcția o va returna dacă nu există un șir necesar în subsetul curent.

Puteți vedea o listă cu toate funcțiile analitice agregate și funcțiile de navigare în documentația pentru Legacy SQL și Standard SQL.

Exemplul 1 . Să presupunem că vrem să analizăm activitatea clienților în timpul orelor de lucru și non-lucrătoare. Pentru a face acest lucru, trebuie să împărțim tranzacțiile în două grupuri și să calculăm valorile de interes:

  • Grupa 1 — Achiziții în timpul programului de lucru de la 9:00 la 18:00
  • Grupa 2 — Achiziții în afara orelor de program de la 00:00 la 9:00 și de la 18:00 la 23:59

Pe lângă orele de lucru și non-lucrătoare, o altă variabilă pentru formarea unei ferestre este clientId. Adică, pentru fiecare utilizator, vom avea două ferestre:

fereastră clientId Ziua
fereastra 1 clientId 1 ore de lucru
fereastra 2 clientId 2 orele nelucrătoare
fereastra 3 clientId 3 ore de lucru
fereastra 4 ID client 4 orele nelucrătoare
fereastra N ID client N ore de lucru
fereastra N+1 clientId N+1 orele nelucrătoare

Să folosim datele demonstrative pentru a calcula venitul mediu, maxim, minim și total, numărul total de tranzacții și numărul de tranzacții unice per utilizator în timpul orelor de lucru și în afara orelor de lucru. Solicitările de mai jos ne vor ajuta să facem acest lucru.

#moștenire SQL

    SELECT date, clientId, DayTime, avg_revenue, max_revenue, min_revenue, sum_revenue, transactions, unique_transactions FROM ( SELECT date, clientId, DayTime, AVG(revenue) OVER (PARTITION BY date, clientId, DayTime) AS avg_revenue, MAX(revenue) OVER (PARTITION BY date, clientId, DayTime) AS max_revenue, MIN(revenue) OVER (PARTITION BY date, clientId, DayTime) AS min_revenue, SUM(revenue) OVER (PARTITION BY date, clientId, DayTime) AS sum_revenue, COUNT(transactionId) OVER (PARTITION BY date, clientId, DayTime) AS transactions, COUNT(DISTINCT(transactionId)) OVER (PARTITION BY date, clientId, DayTime) AS unique_transactions FROM ( SELECT date, date_UTC, clientId, transactionId, revenue, page, hour, CASE WHEN hour>=9 AND hour<=18 THEN 'working hours' ELSE 'non-working hours' END AS DayTime FROM [owox-analytics:t_kravchenko.Demo_data])) GROUP BY date, clientId, DayTime, avg_revenue, max_revenue, min_revenue, sum_revenue, transactions, unique_transactions ORDER BY transactions DESC
SELECT date, clientId, DayTime, avg_revenue, max_revenue, min_revenue, sum_revenue, transactions, unique_transactions FROM ( SELECT date, clientId, DayTime, AVG(revenue) OVER (PARTITION BY date, clientId, DayTime) AS avg_revenue, MAX(revenue) OVER (PARTITION BY date, clientId, DayTime) AS max_revenue, MIN(revenue) OVER (PARTITION BY date, clientId, DayTime) AS min_revenue, SUM(revenue) OVER (PARTITION BY date, clientId, DayTime) AS sum_revenue, COUNT(transactionId) OVER (PARTITION BY date, clientId, DayTime) AS transactions, COUNT(DISTINCT(transactionId)) OVER (PARTITION BY date, clientId, DayTime) AS unique_transactions FROM ( SELECT date, date_UTC, clientId, transactionId, revenue, page, hour, CASE WHEN hour>=9 AND hour<=18 THEN 'working hours' ELSE 'non-working hours' END AS DayTime FROM [owox-analytics:t_kravchenko.Demo_data])) GROUP BY date, clientId, DayTime, avg_revenue, max_revenue, min_revenue, sum_revenue, transactions, unique_transactions ORDER BY transactions DESC

#SQL standard

    #standardSQL SELECT date, clientId, DayTime, avg_revenue, max_revenue, min_revenue, sum_revenue, transactions, unique_transactions FROM ( SELECT date, clientId, DayTime, AVG(revenue) OVER (PARTITION BY date, clientId, DayTime) AS avg_revenue, MAX(revenue) OVER (PARTITION BY date, clientId, DayTime) AS max_revenue, MIN(revenue) OVER (PARTITION BY date, clientId, DayTime) AS min_revenue, SUM(revenue) OVER (PARTITION BY date, clientId, DayTime) AS sum_revenue, COUNT(transactionId) OVER (PARTITION BY date, clientId, DayTime) AS transactions, COUNT(DISTINCT(transactionId)) OVER (PARTITION BY date, clientId, DayTime) AS unique_transactions FROM ( SELECT date, date_UTC, clientId, transactionId, revenue, page, hour, CASE WHEN hour>=9 AND hour<=18 THEN 'working hours' ELSE 'non-working hours' END AS DayTime FROM `owox-analytics.t_kravchenko.Demo_data`)) GROUP BY date, clientId, DayTime, avg_revenue, max_revenue, min_revenue, sum_revenue, transactions, unique_transactions ORDER BY transactions DESC
#standardSQL SELECT date, clientId, DayTime, avg_revenue, max_revenue, min_revenue, sum_revenue, transactions, unique_transactions FROM ( SELECT date, clientId, DayTime, AVG(revenue) OVER (PARTITION BY date, clientId, DayTime) AS avg_revenue, MAX(revenue) OVER (PARTITION BY date, clientId, DayTime) AS max_revenue, MIN(revenue) OVER (PARTITION BY date, clientId, DayTime) AS min_revenue, SUM(revenue) OVER (PARTITION BY date, clientId, DayTime) AS sum_revenue, COUNT(transactionId) OVER (PARTITION BY date, clientId, DayTime) AS transactions, COUNT(DISTINCT(transactionId)) OVER (PARTITION BY date, clientId, DayTime) AS unique_transactions FROM ( SELECT date, date_UTC, clientId, transactionId, revenue, page, hour, CASE WHEN hour>=9 AND hour<=18 THEN 'working hours' ELSE 'non-working hours' END AS DayTime FROM `owox-analytics.t_kravchenko.Demo_data`)) GROUP BY date, clientId, DayTime, avg_revenue, max_revenue, min_revenue, sum_revenue, transactions, unique_transactions ORDER BY transactions DESC

Să vedem ce se întâmplă ca rezultat folosind exemplul utilizatorului cu clientId 102041117.1428132012. În tabelul original pentru acest utilizator, avem următoarele date:

masa demo

Prin rularea interogării, primim un raport care conține venitul mediu, minim, maxim și total de la acest utilizator, precum și numărul total de tranzacții al utilizatorului. După cum puteți vedea în captura de ecran de mai jos, ambele tranzacții au fost efectuate de utilizator în timpul programului de lucru:

masa demo

Exemplul 2 . Acum pentru o sarcină mai complicată:

  • Pune numerele de ordine pentru toate tranzacțiile în fereastră în funcție de momentul executării lor. Amintiți-vă că definim fereastra după utilizator și intervalele de timp de lucru/nefuncțional.
  • Raportați veniturile tranzacției următoare/anterioare (față de cea curentă) în fereastră.
  • Afișați veniturile primei și ultimelor tranzacții în fereastră.

Pentru a face acest lucru, vom folosi următoarele interogări:

#moștenire SQL

    SELECT date, clientId, DayTime, hour, rank, revenue, lead_revenue, lag_revenue, first_revenue_by_hour, last_revenue_by_hour FROM ( SELECT date, clientId, DayTime, hour, DENSE_RANK() OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS rank, revenue, LEAD( revenue, 1) OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS lead_revenue, LAG( revenue, 1) OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS lag_revenue, FIRST_VALUE(revenue) OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS first_revenue_by_hour, LAST_VALUE(revenue) OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS last_revenue_by_hour FROM ( SELECT date, date_UTC, clientId, transactionId, revenue, page, hour, CASE WHEN hour>=9 AND hour<=18 THEN 'working hours' ELSE 'non-working hours' END AS DayTime FROM [owox-analytics:t_kravchenko.Demo_data])) GROUP BY date, clientId, DayTime, hour, rank, revenue, lead_revenue, lag_revenue, first_revenue_by_hour, last_revenue_by_hour ORDER BY date, clientId, DayTime, hour, rank, revenue, lead_revenue, lag_revenue, first_revenue_by_hour, last_revenue_by_hour
SELECT date, clientId, DayTime, hour, rank, revenue, lead_revenue, lag_revenue, first_revenue_by_hour, last_revenue_by_hour FROM ( SELECT date, clientId, DayTime, hour, DENSE_RANK() OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS rank, revenue, LEAD( revenue, 1) OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS lead_revenue, LAG( revenue, 1) OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS lag_revenue, FIRST_VALUE(revenue) OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS first_revenue_by_hour, LAST_VALUE(revenue) OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS last_revenue_by_hour FROM ( SELECT date, date_UTC, clientId, transactionId, revenue, page, hour, CASE WHEN hour>=9 AND hour<=18 THEN 'working hours' ELSE 'non-working hours' END AS DayTime FROM [owox-analytics:t_kravchenko.Demo_data])) GROUP BY date, clientId, DayTime, hour, rank, revenue, lead_revenue, lag_revenue, first_revenue_by_hour, last_revenue_by_hour ORDER BY date, clientId, DayTime, hour, rank, revenue, lead_revenue, lag_revenue, first_revenue_by_hour, last_revenue_by_hour

#SQL standard

    SELECT date, clientId, DayTime, hour, rank, revenue, lead_revenue, lag_revenue, first_revenue_by_hour, last_revenue_by_hour FROM ( SELECT date, clientId, DayTime, hour, DENSE_RANK() OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS rank, revenue, LEAD( revenue, 1) OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS lead_revenue, LAG( revenue, 1) OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS lag_revenue, FIRST_VALUE(revenue) OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS first_revenue_by_hour, LAST_VALUE(revenue) OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS last_revenue_by_hour FROM ( SELECT date, date_UTC, clientId, transactionId, revenue, page, hour, CASE WHEN hour>=9 AND hour<=18 THEN 'working hours' ELSE 'non-working hours' END AS DayTime FROM `owox-analytics.t_kravchenko.Demo_data`)) GROUP BY date, clientId, DayTime, hour, rank, revenue, lead_revenue, lag_revenue, first_revenue_by_hour, last_revenue_by_hour ORDER BY date, clientId, DayTime, hour, rank, revenue, lead_revenue, lag_revenue, first_revenue_by_hour, last_revenue_by_hour
SELECT date, clientId, DayTime, hour, rank, revenue, lead_revenue, lag_revenue, first_revenue_by_hour, last_revenue_by_hour FROM ( SELECT date, clientId, DayTime, hour, DENSE_RANK() OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS rank, revenue, LEAD( revenue, 1) OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS lead_revenue, LAG( revenue, 1) OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS lag_revenue, FIRST_VALUE(revenue) OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS first_revenue_by_hour, LAST_VALUE(revenue) OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS last_revenue_by_hour FROM ( SELECT date, date_UTC, clientId, transactionId, revenue, page, hour, CASE WHEN hour>=9 AND hour<=18 THEN 'working hours' ELSE 'non-working hours' END AS DayTime FROM `owox-analytics.t_kravchenko.Demo_data`)) GROUP BY date, clientId, DayTime, hour, rank, revenue, lead_revenue, lag_revenue, first_revenue_by_hour, last_revenue_by_hour ORDER BY date, clientId, DayTime, hour, rank, revenue, lead_revenue, lag_revenue, first_revenue_by_hour, last_revenue_by_hour

Putem verifica rezultatele calculelor folosind exemplul unui utilizator pe care îl cunoaștem deja: clientId 102041117.1428132012:

masa demo

Din captura de ecran de mai sus, putem vedea că:

  • prima tranzacție a fost la 15:00 și a doua tranzacție a fost la 16:00
  • după tranzacție la ora 15:00, a existat o tranzacție la ora 16:00 cu un venit de 25066 (coloana lead_revenue)
  • înainte de tranzacție la ora 16:00, a existat o tranzacție la ora 15:00 cu un venit de 3699 (coloana lag_revenue)
  • prima tranzacție din fereastră a fost la 15:00, iar venitul pentru această tranzacție a fost 3699 (coloana first_revenue_by_hour)
  • interogarea procesează datele rând cu linie, deci pentru tranzacția în cauză, ultima tranzacție din fereastră va fi însăși și valorile din coloanele last_revenue_by_hour și veniturile vor fi aceleași

Articole utile despre Google BigQuery:

  • Top 6 instrumente de vizualizare BigQuery
  • Cum să încărcați date în Google BigQuery
  • Cum să încărcați date brute din Google Ads în Google BigQuery
  • Conector Google BigQuery Foi de calcul Google
  • Automatizați rapoartele în Foi de calcul Google utilizând datele din Google BigQuery
  • Automatizați rapoartele în Google Data Studio pe baza datelor din Google BigQuery

Dacă doriți să colectați date neeșantionate de pe site-ul dvs. în Google BigQuery, dar nu știți de unde să începeți, rezervați o demonstrație. Vă vom spune despre toate posibilitățile pe care le aveți cu BigQuery și OWOX BI.

Clienții noștri
crește cu 22% mai rapid

Creșteți mai repede, măsurând ceea ce funcționează cel mai bine în marketingul dvs

Analizați-vă eficiența de marketing, găsiți zonele de creștere, creșteți rentabilitatea investiției

Obțineți o demonstrație

Concluzii

În acest articol, ne-am uitat la cele mai populare grupuri de funcții: agregat, dată, șir și fereastră. Cu toate acestea, Google BigQuery are multe mai multe funcții utile, inclusiv:

  • funcții de casting care vă permit să convertiți datele într-un anumit format
  • Funcții wildcard de tabel care vă permit să accesați mai multe tabele dintr-un set de date
  • funcții de expresie regulată care vă permit să descrieți modelul unei interogări de căutare și nu valoarea sa exactă

Cu siguranță vom scrie despre aceste funcții pe blogul nostru. Între timp, puteți încerca toate funcțiile descrise în acest articol folosind datele noastre demonstrative.

bonus pentru cititori

Date demonstrative pentru practica interogărilor SQL

Descărcați acum