web-dev-qa-db-fra.com

BigQuery StandardSQL: 7 derniers jours en utilisant _TABLE_SUFFIX

Question: Je souhaite extraire des données de plusieurs tables de sessions Google Analytics à l'aide de _TABLE_SUFFIX, mais je souhaite définir les paramètres de suffixe entre "il y a sept jours" et "il y a un jour" (c'est-à-dire extraire les données des 7 derniers jours)

La syntaxe actuelle (qui ne fonctionne pas):

#StandardSQL
SELECT
  date,
  SUM (totals.visits) AS visits
FROM
  `projectname.123456789.ga_sessions_*`
WHERE
  _TABLE_SUFFIX BETWEEN 
  'DATE_ADD(CURRENT_TIMESTAMP(), INTERVAL -7 DAY)' AND 
  'DATE_ADD(CURRENT_TIMESTAMP(), INTERVAL -1 DAY)'
GROUP BY 
   date
ORDER BY 
   date ASC

Ce qui me donne le message " Valide: Cette requête traitera 0 B lors de son exécution." À mes yeux, il n'y a pas d'erreur dans la syntaxe, mais BigQuery ne peut pas lire mes fonctions de date et ne peut donc pas les suffixer au caractère générique ga_sessions_ *

Inspiration:

BigQuery Cookbook a un exemple pour legacySQL sur lequel je me base: ( https://support.google.com/analytics/answer/4419694?hl=en#7days )

#LegacySQL
SELECT
  date,
  SUM (totals.visits) AS visits
FROM 
  (TABLE_DATE_RANGE([73156703.ga_sessions_], 
  DATE_ADD(CURRENT_TIMESTAMP(), -7, 'DAY'), 
  DATE_ADD(CURRENT_TIMESTAMP(), -1, 'DAY')))
GROUP BY
  date
ORDER BY
  date ASC 

Choses que j'ai essayées: (cela ne fonctionne pas)

Utilisation de DATE_SUB au lieu de DATE_ADD et utilisation de CURRENT_DATE au lieu de CURRENT_TIMESTAMP:

WHERE
   _TABLE_SUFFIX BETWEEN 
   'DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY)' AND 
   'DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)'

Résultat: " Valide: Cette requête traitera 0 B lors de son exécution."

Utilisation de DATE_FORMAT autour de DATE_SUB et CURRENT_DATE afin d'obtenir les dates sans tirets:

WHERE
   _TABLE_SUFFIX BETWEEN 
   'FORMAT_DATE("%Y%m%d", DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY))' AND 
   'FORMAT_DATE("%Y%m%d", DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))'

Résultat: " Valide: Cette requête traitera 0 B lors de son exécution."

J'ai essayé de sauter les tirets '' autour de la clause DATE_SUB

WHERE
  _TABLE_SUFFIX BETWEEN 
  DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY) AND
  DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)

Il en résulte le message d'erreur suivant " Erreur: Aucune signature correspondante pour l'opérateur BETWEEN pour les types d'argument: STRING, DATE, DATE. Signature prise en charge: (ANY) BETWEEN (TOUT) ET (TOUT) "

Merci d'avance,

9
Malex Berg

La réponse d'Elliott est correcte, mais si vous souhaitez tirer le meilleur parti de BigQuery pour ce type de requête, au lieu de convertir _TABLESUFFIX en DATE, vous devez convertir CURRENT_DATE expressions aux chaînes:

WHERE
  _TABLE_SUFFIX BETWEEN 
  FORMAT_DATE("%Y%m%d", DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY)) AND
  FORMAT_DATE("%Y%m%d", DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))
14
Mosha Pasumansky

Vous étiez presque là avec votre dernière tentative. Vous devez convertir votre chaîne en une date afin de l'utiliser dans la comparaison:

WHERE
  PARSE_DATE('%Y%m%d', _TABLE_SUFFIX) BETWEEN 
  DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY) AND
  DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)
8
Elliott Brossard

Cela fonctionne pour tous ceux qui cherchent à segmenter la dernière semaine de données en grande requête. Fonctionne pour n'importe quel ensemble de données tant que vous avez un horodatage!

where TIMESTAMPFIELD >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
0
Will