Problema de script de grande consulta SQL

Oct 20 2020

você poderia me ajudar, eu não entendo o que há de errado com o meu ONDE. Tentei várias coisas, mas não consegui chegar à conclusão certa.

SELECT 
CONCAT(fullvisitorId, "-", CAST(visitstarttime AS STRING)) as session,
RANK() OVER(PARTITION BY CONCAT(fullvisitorId, "-", CAST(visitstarttime AS STRING)) ORDER BY hitNumber ASC) AS Rank, 
(SELECT MAX(cd.value) FROM hits.customDimensions as cd where cd.index = 12) as cd1,
(SELECT cd.value FROM hits.customDimensions as cd where cd.index=29) as division,
hits.hitnumber

FROM 
  `dl-training-bigquery.NDA_CHAN*******51.ga_sessions_20191202` as session,
  unnest(hits) as hits
  
WHERE division = 'fsh'
ORDER BY hitnumber ASC

insira a descrição da imagem aqui

Respostas

GordonLinoff Oct 20 2020 at 03:37

divisionparece ser um alias de coluna definido no select.

Isso não é permitido no SQL (em geral, não apenas no BigQuery). Use uma subconsulta ou CTE para definir division. Em seguida, filtre na consulta externa.

GMB Oct 20 2020 at 03:40

Você não pode reutilizar uma coluna definida na SELECTcláusula no mesmo escopo (à esquerda da ORDER BYcláusula). Aqui, a abordagem mais simples é provavelmente mover as subconsultas para a FROMcláusula:

SELECT 
    CONCAT(fullvisitorId, "-", CAST(visitstarttime AS STRING)) as session,
    RANK() OVER(PARTITION BY fullvisitorId, visitstarttime ORDER BY hitNumber) as rank, 
    dim1.cd1,
    dim2.division,
    hits.hitnumber
FROM `dl-training-bigquery.NDA_CHAN*******51.ga_sessions_20191202` as session
CROSS JOIN unnest(hits) as hits
CROSS JOIN (SELECT MAX(cd.value) as cd1 FROM hits.customDimensions as cd where cd.index = 12) as dim1
CROSS JOIN (SELECT cd.value as division FROM hits.customDimensions as cd where cd.index = 29) as dim2  
WHERE dim2.division = 'fsh'
ORDER BY hitnumber ASC

Observe que simplifiquei a PARTITION BYcláusula da função de janela: não acho que você precisa de concatenação de string aqui, você pode apenas usar uma partição de dois níveis.

Também alterei as junções implícitas para cross joins explícitas . Isso não muda a lógica, mas torna a intenção mais clara em minha opinião.