SQL 큰 쿼리 스크립트 문제
Oct 20 2020
도와 주시겠습니까? 내 WHERE에 무엇이 잘못되었는지 이해하지 못합니다. 여러 가지를 시도했지만 올바른 결론으로 끝날 수 없었습니다.
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
여기에 이미지 설명 입력
답변
GordonLinoff Oct 20 2020 at 03:37
division에 정의 된 열 별칭 인 것 같습니다 select.
SQL에서는 허용되지 않습니다 (일반적으로 BigQuery뿐 아니라). 하위 쿼리 또는 CTE를 사용하여 division. 그런 다음 외부 쿼리를 필터링합니다.
GMB Oct 20 2020 at 03:40
SELECT동일한 범위 의 절에 정의 된 열을 재사용 할 수 없습니다 ( ORDER BY절을 제외 ). 여기서 가장 간단한 방법은 하위 쿼리를 FROM절로 이동하는 것입니다 .
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
PARTITION BY창 함수 의 절을 단순화했습니다 . 여기서 문자열 연결이 필요하지 않다고 생각합니다. 2 단계 파티션 만 사용할 수 있습니다.
또한 암시 적 조인을 명시 적 cross joins로 변경했습니다 . 이것은 논리를 변경하지 않지만 내 의견으로는 의도를 더 명확하게 만듭니다.