2016-11-24 1 views
3

tables Google Analytics BigQuery sont structurés comme ceci (héritage notations SQL - seuls les champs pertinents sont affichés):UNNEST références d'expression colonne qui est ni regroupées ni agrégées

visitId:      INTEGER 
hits:       RECORD/REPEATED 
hits.hour:     INTEGER 

Sur une telle table, la requête suivante fonctionne bien :

SELECT 
    visitId, 
    MIN(h.hour) AS firstHitHour 
FROM 
    `my-table.ga_sessions_20161122`, UNNEST(hits) AS h 
GROUP BY 
    visitId 

Mais en utilisant cette syntaxe alternative:

SELECT 
    visitId, 
    (SELECT MIN(hour) FROM UNNEST(hits)) as firstHitHour 
FROM 
    `my-table.ga_sessions_20161122` 
GROUP BY 
    visitId 

Déclenche l'erreur suivante:

Error: UNNEST expression references column hits which is neither grouped nor aggregated

Je comprends que UNNEST(hits) doit être en quelque sorte regroupées ou agrégées, mais étant donné que cette colonne est un array (repeated), qu'est-ce que ça veut dire exactement?

Si je tente de "groupe de la colonne hits", comme l'a demandé, comme ceci:

(SELECT MIN(hour) FROM UNNEST(hits) as h GROUP BY h) as firstHitHour 

Puis-je obtenir une erreur Grouping by expressions of type STRUCT is not allowed.

Comment cette syntaxe alternative peut-elle être corrigée pour produire le même résultat que la première?

Répondre

4

Ma première réponse est la version originale de cette question.
Quand je répondu, je l'ai réalisé que vous avez changé tout à fait différent: o)

donc ci-dessous réponse est pour la version la plus récente de votre question:

Je pense que dans la version « alternative » vous faites juste pas besoin de la clause GROUP BY, parce que vous utilisez sur la ligne d'origine (aplaties non) par ligne et pour chaque ligne (visitId) calculer firstHitHour

SELECT 
    visitId, 
    (SELECT MIN(hour) FROM UNNEST(hits)) as firstHitHour 
FROM 
    `my-table.ga_sessions_20161122` 

Dans votre requête initiale - vous sorte d'aplatir tous les enregistrements pour chaque rangée - c'est pourquoi vous devez alors les regrouper

3

Essayez ci-dessous (il utilise par exemple de votre question initiale):

SELECT 
    visitId, source, medium, browser, 
    MIN(hour) AS firstHitHour, 
    LOGICAL_OR(hasValue) AS hasValue 
FROM (
    SELECT 
    visitId, 
    trafficSource.source AS source, 
    trafficSource.medium AS medium, 
    device.browser AS browser, 
    h.hour AS hour, 
    EXISTS(SELECT 1 FROM UNNEST(hits) WHERE eventInfo.eventCategory = "SomeValue") AS hasValue 
    FROM 
    `my-table.ga_sessions_20161122`, UNNEST(hits) AS h 
) 
GROUP BY 
visitId, source, medium, browser;