Un aperçu des principales fonctions de Google BigQuery et des exemples de requĂȘtes pour l'analyse marketing

Google BigQuery est un stockage rapide, Ă©conomique et Ă©volutif pour Big Data que vous pouvez utiliser si vous n'avez pas la capacitĂ© ou le dĂ©sir d'hĂ©berger vos propres serveurs. Il peut ĂȘtre utilisĂ© pour Ă©crire des requĂȘtes Ă  l'aide de la syntaxe de type SQL, des fonctions standard et dĂ©finies par l'utilisateur .



Dans cet article, je vais vous parler des principales fonctions de BigQuery et montrer leurs capacitĂ©s avec des exemples spĂ©cifiques. Vous pouvez Ă©crire des requĂȘtes de base et les essayer sur des donnĂ©es de dĂ©monstration.



Qu'est-ce que SQL et quels dialectes il a



SQL (Structured Query Language) est un langage de requĂȘte structurĂ© pour travailler avec des bases de donnĂ©es. Avec son aide, vous pouvez recevoir, ajouter Ă  la base de donnĂ©es et modifier de grandes quantitĂ©s de donnĂ©es. Google BigQuery prend en charge deux dialectes: SQL standard et SQL hĂ©ritĂ©.



Le dialecte à choisir dépend de vos préférences, mais Google recommande d'utiliser Standard SQL en raison d'un certain nombre d'avantages:



  • FlexibilitĂ© et fonctionnalitĂ© lors de l'utilisation de champs imbriquĂ©s et rĂ©pĂ©titifs.
  • Prise en charge des langages DML et DDL , qui vous permettent de modifier les donnĂ©es dans les tables, ainsi que de manipuler les tables et les vues dans GBQ.
  • Le traitement de grandes quantitĂ©s de donnĂ©es est plus rapide que Legasy SQL.
  • Prise en charge de toutes les mises Ă  jour actuelles et futures de BigQuery.


Vous pouvez en savoir plus sur la différence entre les dialectes dans l' aide .



Par dĂ©faut, les requĂȘtes Google BigQuery s'exĂ©cutent sur l'ancien SQL.



Il existe plusieurs façons de passer au SQL standard:



  1. Dans l'interface BigQuery, dans la fenĂȘtre d'Ă©dition des requĂȘtes, sĂ©lectionnez "Afficher les options" et dĂ©cochez la case Ă  cĂŽtĂ© de l'option "Utiliser l'ancien SQL".



  2. Ajoutez la ligne #standardSQL avant la requĂȘte et dĂ©marrez la requĂȘte sur une nouvelle ligne



OĂč commencer



Afin que vous puissiez vous entraĂźner Ă  exĂ©cuter des requĂȘtes en parallĂšle avec la lecture de l'article, j'ai prĂ©parĂ© pour vous un tableau avec des donnĂ©es de dĂ©monstration . Chargez les donnĂ©es de la feuille de calcul dans votre projet Google BigQuery.



Si vous n'avez pas encore de projet GBQ, créez-en un. Pour ce faire, vous devez disposer d'un compte de facturation actif dans Google Cloud Platform . Vous devrez lier la carte, mais à votre insu, l'argent ne sera pas débité de celle-ci.De plus, lors de votre inscription, vous recevrez 300 $ pour 12 mois , que vous pourrez consacrer au stockage et au traitement des données.



Fonctionnalités de Google BigQuery



Les groupes de fonctions les plus couramment utilisĂ©s lors de la crĂ©ation de requĂȘtes sont la fonction d'agrĂ©gation, la fonction de date, la fonction de chaĂźne et la fonction de fenĂȘtre. Maintenant, plus sur chacun d'eux.



Fonction d'agrégation



Les fonctions d'agrégation vous permettent d'obtenir des valeurs récapitulatives sur l'ensemble du tableau. Par exemple, calculez le chÚque moyen, le revenu mensuel total ou mettez en surbrillance le segment d'utilisateurs qui ont effectué le nombre maximal d'achats.



Voici les fonctionnalités les plus populaires de cette section:

SQL hérité SQL standard Que fait la fonction
AVG (champ) AVG ([DISTINCT] (champ)) Renvoie la moyenne de la colonne de champ. En SQL standard, lors de l'ajout de la clause DISTINCT, la moyenne est calculée uniquement pour les lignes avec des valeurs uniques (non dupliquées) de la colonne de champ
MAX (champ) MAX (champ) Renvoie la valeur maximale de la colonne de champ
MIN (champ) MIN (champ) Renvoie la valeur minimale de la colonne de champ
SUM (champ) SUM (champ) Renvoie la somme des valeurs de la colonne de champ
COUNT (champ) COUNT (champ) Renvoie le nombre de lignes dans le champ de colonne
EXACT_COUNT_DISTINCT (champ) COUNT ([DISTINCT] (champ)) Renvoie le nombre de lignes uniques dans la colonne de champ


Vous pouvez trouver une liste de toutes les fonctions dans l'aide: Legacy SQL et Standard SQL .



Voyons comment les fonctions rĂ©pertoriĂ©es fonctionnent avec un exemple de dĂ©monstration de donnĂ©es. Calculons le revenu moyen des transactions, des achats avec le montant le plus Ă©levĂ© et le plus bas, le revenu total et le nombre de toutes les transactions. Pour vĂ©rifier si les achats sont dupliquĂ©s, nous calculerons Ă©galement le nombre de transactions uniques. Pour ce faire, nous Ă©crivons une requĂȘte dans laquelle nous indiquons le nom de notre projet, ensemble de donnĂ©es et table Google BigQuery.



#legasy 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]


# 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`


En conséquence, nous obtenons les résultats suivants:







Vous pouvez vérifier les résultats du calcul dans le tableau d'origine avec des données de démonstration en utilisant les fonctions standard de Google Sheets (SUM, AVG et autres) ou des tableaux croisés dynamiques.



Comme vous pouvez le voir sur la capture d'écran ci-dessus, le nombre de transactions et de transactions uniques est différent.

Cela suggĂšre qu'il y a 2 transactions dans notre table qui ont une transactionId en double:







Par consĂ©quent, si vous ĂȘtes intĂ©ressĂ© par des transactions uniques, utilisez la fonction qui compte les lignes uniques. Vous pouvez Ă©galement regrouper les donnĂ©es Ă  l'aide d'une clause GROUP BY pour supprimer les doublons avant d'utiliser la fonction d'agrĂ©gation.



Fonctions pour travailler avec les dates (fonction Date)



Ces fonctions permettent de traiter les dates: modifier leur format, sélectionner la partie souhaitée (jour, mois ou année), décaler la date d'un certain intervalle.



Ils peuvent vous ĂȘtre utiles dans les cas suivants:



  • Lors de la configuration d'analyses de bout en bout - pour regrouper les dates et heures de diffĂ©rentes sources dans un seul format.
  • Lors de la crĂ©ation de rapports mis Ă  jour automatiquement ou de mailings dĂ©clenchĂ©s. Par exemple, lorsque vous avez besoin de donnĂ©es pour les 2 derniĂšres heures, une semaine ou un mois.
  • Lors de la crĂ©ation de rapports de cohorte dans lesquels il est nĂ©cessaire d'obtenir des donnĂ©es dans le contexte de jours, semaines, mois.


Fonctions de date les plus couramment utilisées:



SQL hérité SQL standard Que fait la fonction
DATE ACTUELLE () DATE ACTUELLE () Renvoie la date actuelle au format% AAAA-% MM-% JJ
DATE (horodatage) DATE (horodatage) Convertit une date au format% AAAA-% MM-% JJ% H:% M:% S. au format% AAAA-% MM-% JJ
DATE_ADD (horodatage, intervalle, interval_units) DATE_ADD(timestamp, INTERVAL interval interval_units) timestamp, interval.interval_units.



Legacy SQL YEAR, MONTH, DAY, HOUR, MINUTE SECOND, Standard SQL — YEAR, QUARTER, MONTH, WEEK, DAY

DATE_ADD(timestamp, — interval, interval_units) DATE_SUB(timestamp, INTERVAL interval interval_units) timestamp, interval
DATEDIFF(timestamp1, timestamp2) DATE_DIFF(timestamp1, timestamp2, date_part) timestamp1 timestamp2.

Legacy SQL , Standard SQL — date_part (, , , , )
DAY(timestamp) EXTRACT(DAY FROM timestamp) timestamp. 1 31
MONTH(timestamp) EXTRACT(MONTH FROM timestamp) timestamp. 1 12
YEAR(timestamp) EXTRACT(YEAR FROM timestamp) timestamp


Pour obtenir la liste de toutes les fonctionnalités, consultez l'aide de Legacy SQL et de SQL standard .



Regardons une dĂ©mo des donnĂ©es, comment chacune des fonctions ci-dessus fonctionne. Par exemple, nous obtenons la date actuelle, apportons la date de la table d'origine au format% AAAA-% MM-% JJ, soustrayons et ajoutons un jour. Ensuite, nous calculons la diffĂ©rence entre la date actuelle et la date de la table d'origine et divisons la date actuelle sĂ©parĂ©ment en annĂ©e, mois et jour. Pour ce faire, vous pouvez copier les exemples de requĂȘtes ci-dessous et remplacer le nom du projet, de l'ensemble de donnĂ©es et de la table de donnĂ©es par le vĂŽtre.



#legasy 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]


# 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`)


AprÚs avoir appliqué la demande, vous recevrez le rapport suivant:







Fonctions pour travailler avec des chaĂźnes (fonction String)



Les fonctions de chaĂźne vous permettent de former une chaĂźne, de mettre en Ă©vidence et de remplacer des sous-chaĂźnes, de calculer la longueur de la chaĂźne et l'index ordinal de la sous-chaĂźne dans la chaĂźne d'origine.



Par exemple, avec leur aide, vous pouvez:



  • CrĂ©ez des filtres dans le rapport par balises UTM qui sont transmises Ă  l'URL de la page.
  • Apportez les donnĂ©es dans un format unifiĂ© si les noms des sources et des campagnes sont Ă©crits dans des registres diffĂ©rents.
  • Remplacez les donnĂ©es incorrectes dans le rapport, par exemple, si le nom de la campagne a Ă©tĂ© envoyĂ© avec une faute de frappe.


Les fonctions les plus populaires pour travailler avec des chaĂźnes:

SQL hérité SQL standard Que fait la fonction
CONCAT ('str1', 'str2') ou 'str1' + 'str2' CONCAT ('str1', 'str2') ConcatĂšne plusieurs chaĂźnes 'str1' et 'str2' en une seule
'str1' CONTIENT 'str2' REGEXP_CONTAINS('str1', 'str2') 'str1' LIKE ‘%str2%’ true 'str1' ‘str2’.

Standard SQL ‘str2’ re2
LENGTH('str' ) CHAR_LENGTH('str' )

CHARACTER_LENGTH('str' )
'str' ( )
SUBSTR('str', index [, max_len]) SUBSTR('str', index [, max_len]) max_len, index 'str'
LOWER('str') LOWER('str') 'str'
UPPER(str) UPPER(str) 'str'
INSTR('str1', 'str2') STRPOS('str1', 'str2') Renvoie l'index de la premiĂšre occurrence de la chaĂźne 'str2' dans la chaĂźne 'str1', sinon - 0
REMPLACER ('str1', 'str2', 'str3') REMPLACER ('str1', 'str2', 'str3') Remplace dans la chaßne «str1» la sous-chaßne «str2» par la sous-chaßne «str3»


Plus de détails - dans l'aide: Legacy SQL et Standard SQL .



Analysons comment utiliser les fonctions décrites en utilisant l'exemple des données de démonstration. Supposons que nous ayons 3 colonnes distinctes qui contiennent les valeurs du jour, du mois et de l'année:



travailler avec une date dans ce format n'est pas trĂšs pratique, nous allons donc la combiner en une seule colonne. Pour ce faire, utilisez les requĂȘtes SQL ci-dessous et n'oubliez pas d'inclure le nom de votre projet, de l'ensemble de donnĂ©es et de la table Google BigQuery.



#legasy SQL



SELECT
  CONCAT(the_day,'-',the_month,'-',the_year) AS mix_string1,
  the_day+'-'+the_month+'-'+the_year AS mix_string2
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,
  mix_string2


# 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


AprÚs avoir exécuté la demande, nous recevrons la date dans une colonne:







Souvent, lors du chargement d'une page spĂ©cifique sur le site, l'URL contient les valeurs des variables que l'utilisateur a sĂ©lectionnĂ©es. Cela peut ĂȘtre un mode de paiement ou de livraison, un numĂ©ro de transaction, un index d'un magasin physique oĂč un client souhaite rĂ©cupĂ©rer un article, etc. En utilisant une requĂȘte SQL, vous pouvez extraire ces paramĂštres de l'adresse de la page.



Regardons deux exemples de comment et pourquoi faire cela.



Exemple 1 . Disons que nous voulons connaĂźtre le nombre d'achats auquel les utilisateurs rĂ©cupĂšrent des articles dans des magasins physiques. Pour ce faire, vous devez compter le nombre de transactions envoyĂ©es depuis les pages dont l'URL contient la sous-chaĂźne shop_id (index du magasin physique). Nous faisons cela en utilisant les requĂȘtes suivantes:



#legasy 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


# 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


A partir du tableau résultant, nous voyons que 5502 transactions ont été envoyées à partir des pages contenant le shop_id (check = true):







Exemple 2 . Supposons que vous ayez attribué votre delivery_id à chaque méthode de livraison et que vous écriviez la valeur de ce paramÚtre dans l'URL de la page. Pour savoir quelle méthode de livraison l'utilisateur a choisie, sélectionnez delivery_id dans une colonne distincte.

Nous utilisons les requĂȘtes suivantes pour cela:



#legasy 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


# 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


En conséquence, nous obtenons le tableau suivant dans Google BigQuery:







Fonctions pour travailler avec des sous-ensembles de donnĂ©es ou des fonctions de fenĂȘtre (fonction FenĂȘtre)



Ces fonctions sont similaires aux fonctions d'agrĂ©gation dĂ©crites ci-dessus. Leur principale diffĂ©rence est que les calculs ne sont pas effectuĂ©s sur l'ensemble complet de donnĂ©es sĂ©lectionnĂ©es Ă  l'aide d'une requĂȘte, mais sur une partie de celui-ci - un sous-ensemble ou une fenĂȘtre.



À l'aide des fonctions de fenĂȘtre, vous pouvez agrĂ©ger des donnĂ©es par groupes sans utiliser l'opĂ©rateur JOIN pour combiner plusieurs requĂȘtes. Par exemple, calculez le revenu moyen par campagnes publicitaires, le nombre de transactions par appareil. En ajoutant un autre champ au rapport, vous pouvez facilement connaĂźtre, par exemple, la part des revenus d'une campagne publicitaire le Black Friday ou la part des transactions effectuĂ©es depuis une application mobile.



Avec chaque fonction, une expression OVER doit ĂȘtre Ă©crite dans la requĂȘte, qui dĂ©finit les limites de la fenĂȘtre. OVER contient 3 composants avec lesquels vous pouvez travailler:



  • PARTITION BY - dĂ©finit l'attribut par lequel vous diviserez les donnĂ©es source en sous-ensembles, par exemple PARTITION BY clientId, DayTime.
  • ORDER BY - dĂ©finit l'ordre des lignes dans le sous-ensemble, par exemple ORDER BY hour DESC.
  • WINDOW FRAME - vous permet de traiter les lignes dans un sous-ensemble selon une caractĂ©ristique spĂ©cifique. Par exemple, vous pouvez calculer la somme de toutes les lignes de la fenĂȘtre, mais uniquement des cinq premiĂšres avant la ligne actuelle.


Ce tableau rĂ©sume les fonctions de fenĂȘtre les plus couramment utilisĂ©es:

SQL hérité SQL standard Que fait la fonction
AVG (champ)

COUNT (champ)

COUNT (champ DISTINCT)

MAX ()

MIN ()

SUM ()

AVG ([DISTINCT] (champ))

COUNT (champ)

COUNT ([DISTINCT] (champ))

MAX (champ)

MIN (champ)

SUM (champ)

, , , field .



DISTINCT , ()

'str1' CONTAINS 'str2' REGEXP_CONTAINS('str1', 'str2') 'str1' LIKE ‘%str2%’ true 'str1' ‘str2’.

Standard SQL ‘str2’ re2
DENSE_RANK() DENSE_RANK()
FIRST_VALUE(field) FIRST_VALUE (field[{RESPECT | IGNORE} NULLS]) field .



field . RESPECT IGNORE NULLS , NULL

LAST_VALUE(field) LAST_VALUE (field [{RESPECT | IGNORE} NULLS]) field .



field . RESPECT IGNORE NULLS , NULL

LAG(field) LAG (field[, offset [, default_expression]]) field .



Offset , . .



Default_expression — , ,

LEAD(field) LEAD (field[, offset [, default_expression]]) field .



Offset , . .



Default_expression — , ,



Vous pouvez voir une liste de toutes les fonctions dans l'aide pour Legacy SQL et pour SQL standard: fonctions analytiques agrégées , fonctions de navigation .



Exemple 1. Disons que nous voulons analyser l'activité des clients pendant les heures de travail et les heures non travaillées. Pour ce faire, il est nécessaire de diviser les transactions en 2 groupes et de calculer les métriques qui nous intéressent:



  • Groupe 1 - achats pendant les heures d'ouverture de 9h00 Ă  18h00.
  • Groupe 2 - achats en dehors des heures de travail de 00h00 Ă  9h00 et de 18h00 Ă  00h00.


En plus des heures de travail et non travaillĂ©es, un autre signe pour la formation d'une fenĂȘtre sera le clientId, c'est-Ă -dire que pour chaque utilisateur, nous aurons deux fenĂȘtres:

Sous-ensemble (fenĂȘtre) identitĂ© du client Jour
1 fenĂȘtre clientId 1 Temps de travail
2 fenĂȘtre clientId 2 Heures non ouvrĂ©es
3 fenĂȘtre clientId 3 Temps de travail
4 fenĂȘtre clientId 4 Heures non ouvrĂ©es
FenĂȘtre N clientId N Temps de travail
FenĂȘtre N + 1 clientId N + 1 Heures non ouvrĂ©es


Calculons le revenu moyen, maximum, minimum et total, le nombre de transactions et le nombre de transactions uniques pour chaque utilisateur pendant les heures de travail et non travaillĂ©es sur les donnĂ©es de dĂ©monstration. Les requĂȘtes ci-dessous nous aideront Ă  le faire.



#legasy 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 ' '
        ELSE ' '
      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



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 ' '
        ELSE ' '
      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


Voyons ce qui s'est passĂ© en consĂ©quence, en utilisant l'exemple de l'un des utilisateurs avec clientId = '102041117.1428132012 â€Č. Dans le tableau d'origine de cet utilisateur, nous avions les donnĂ©es suivantes:







En appliquant la requĂȘte, nous avons reçu un rapport contenant le revenu moyen, minimum, maximum et total de cet utilisateur, ainsi que le nombre de transactions. Comme vous pouvez le voir dans la capture d'Ă©cran ci-dessous, l'utilisateur a effectuĂ© les deux transactions pendant les heures ouvrables:





Exemple 2 . Maintenant, compliquons un peu la tĂąche:



  • Inscrivons les numĂ©ros de sĂ©rie de toutes les transactions dans la fenĂȘtre, en fonction de l'heure de leur exĂ©cution. Rappelons que nous dĂ©finissons la fenĂȘtre par utilisateur et temps de travail / non-travail.
  • Affichons le revenu de la transaction suivante / prĂ©cĂ©dente (par rapport Ă  la transaction actuelle) dans la fenĂȘtre.
  • Affichons le revenu de la premiĂšre et de la derniĂšre transaction dans la fenĂȘtre.


Pour cela, nous utilisons les requĂȘtes suivantes:



#legasy 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 ' '
        ELSE ' '
      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 ' '
        ELSE ' '
      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


VĂ©rifions les rĂ©sultats du calcul en utilisant l'exemple d'un utilisateur dĂ©jĂ  familier avec clientId = '102041117.1428132012 â€Č:







De la capture d'Ă©cran ci-dessus, nous voyons que:



  • La premiĂšre transaction a eu lieu Ă  15h00 et la seconde Ă  16h00.
  • AprĂšs la transaction en cours Ă  15h00, il y a eu une transaction Ă  16h00, dont le revenu est de 25066 (colonne lead_revenue).
  • Avant la transaction en cours Ă  16h00, il y avait une transaction Ă  15h00 avec un chiffre d'affaires de 3699 (colonne lag_revenue).
  • La premiĂšre transaction dans la fenĂȘtre Ă©tait une transaction Ă  15h00, dont le revenu est de 3699 (colonne first_revenue_by_hour).
  • La demande traite les donnĂ©es ligne par ligne, donc pour la transaction en question, ce sera la derniĂšre de la fenĂȘtre et les valeurs des colonnes last_revenue_by_hour et revenue seront les mĂȘmes.


conclusions



Dans cet article, nous avons couvert les fonctions les plus populaires des sections Fonction d'agrĂ©gation, fonction de date, fonction de chaĂźne, fonction de fenĂȘtre. Cependant, Google BigQuery propose de nombreuses autres fonctionnalitĂ©s utiles, par exemple:



  • Fonctions de diffusion - vous permettent de diffuser des donnĂ©es dans un format spĂ©cifique.
  • Fonctions gĂ©nĂ©riques de table - vous permettent d'accĂ©der Ă  plusieurs tables Ă  partir d'un ensemble de donnĂ©es.
  • Fonctions d'expression rĂ©guliĂšre - vous permettent de dĂ©crire le modĂšle d'une requĂȘte de recherche, et non sa valeur exacte.


Écrivez dans les commentaires s'il est judicieux d'Ă©crire dans les mĂȘmes dĂ©tails Ă  leur sujet.



All Articles