2017-05-18 5 views
0

Je regarde les actions particulières d'un visiteur sur notre site juste pour comprendre comment certaines données sont collectées et comment extraire les données dont j'ai besoin. Fondamentalement, des promotions spécifiques sont déclenchées lorsqu'un visiteur voit certaines sections de notre site et je voulais voir si ces données sont collectées.Pourquoi, lors de la suppression de deux variables ou plus dans BigQuery, je n'obtiens aucun résultat?

J'ai couru le code suivant pour identifier les pages visualisées par un visiteur et les événements les incendies de session:

select fullvisitorid, visitid, date, hitnumber, type, page.pagepath, 
eventinfo.eventcategory, eventinfo.eventlabel, eventinfo.eventaction 
from `big-query-156009.xxxxxx.ga_sessions_*` t, t.hits as hits 
where _table_suffix between "20170511" and "20170511" 
and fullvisitorid = 'xxxxxxxxxxxxxxxxxxxxxxxxxx' 
and visitid = xxxxxxxxx 
order by hitnumber 

Cela fonctionne parfaitement bien et je peux voir le chemin du visiteur. Je veux aussi tirer dans

hits.promotion.promoid, 
hits.promotion.promoname, 
hits.promotion.promocreative, 
hits.promotion.promoposition, 
hits.promotionactioninfo.promoisview, 
hits.promotionactioninfo.promoisclick 

J'ai essayé cela en utilisant le code suivant:

select fullvisitorid, 
visitid, 
date, 
hitnumber, 
type, 
page.pagepath, 
eventinfo.eventcategory, 
eventinfo.eventlabel, 
eventinfo.eventaction, 
promotion.promoId, 
promotion.promoname, 
promotion.promocreative, 
promotion.promoposition, 
promotionactioninfo.promoIsView, 
promotionactioninfo.promoIsclick 
from `big-query-156009.xxxxxx.ga_sessions_*` t, t.hits as hits, 
hits.promotion as promotion 
where _table_suffix between "20170511" and "20170511" 
and fullvisitorid = 'xxxxxxxxxxxxxxxxxxxxxxxxxx' 
and visitid = xxxxxxxxx 
order by hitnumber 

mais quand je fais cela va exactement les mêmes fullVisitorId, visitid, dates et ensemble de données, etc. Je ne reçois pas résultats. Aucune erreur ou quoi que ce soit juste aucun résultat.

Je ne comprends pas parfaitement l'imbrication, donc je suppose qu'il me manque quelque chose de simple.

Y at-il un moyen de contourner ce problème pour extraire toutes ces données en une seule requête ou dois-je faire des sous-requêtes?

Merci

Répondre

2

En utilisant la virgule (rejoindre) l'opérateur entre la table, t.hits et hits.promotion, vous prenez le produit croisé des éléments des tableaux. Qu'est-ce qui se passe dans ce cas est que, parce que l'un des tableaux est vide (probablement hits.promotion), vous obtenez un résultat vide depuis 1 * <number of hits> * 0 = 0. Pour obtenir une ligne, même si l'un des tableaux est vide, utilisez une jointure gauche au lieu, par exemple:

from `big-query-156009.xxxxxx.ga_sessions_*` t 
LEFT JOIN UNNEST(t.hits) as hits 
LEFT JOIN UNNEST(hits.promotion) as promotion 
where ... 
+0

magnifique! cela fonctionne parfaitement. Merci Elliott! –

0

Une autre technique qui peut vous aider dans ce type d'analyses est en cours d'exécution comme suit:

SELECT 
    fullvisitorid fv, 
    visitid v, 
    ARRAY(SELECT AS STRUCT hits.hitnumber, hits.type, page.pagepath, eventinfo.eventcategory, promotion FROM UNNEST(hits) hits ORDER BY hitnumber) hits 
FROM `big-query-156009.xxxxxx.ga_sessions_*` 
WHERE 
1 = 1 
AND EXISTS(SELECT 1 FROM UNNEST(hits) hits WHERE ARRAY_LENGTH(hits.promotion) > 0) 

Notez que le processus UNNESTING se produit maintenant uniquement au niveau de la ligne et non en tant que CROSS-JOIN.

Vous pouvez également utiliser la clause WHERE pour filtrer exactement ce que vous voulez (dans ce cas, j'ai enlevé toutes les lignes qui n'ont pas Vous pouvez aussi, par exemple, une ID de promotion qui leur est associée. Filtrer seulement certains eventcategories ou étiquettes si vous voulez).