2017-07-06 130 views
0
我有我的SQL调用的一部分麻烦

,我收到此错误
Error: Syntax error: Each subquery argument for table-valued function calls must be enclosed in parentheses. To fix this, replace SELECT... with (SELECT...) at [32:5]
这是在SELECTFULL OUTER JOIN EACH后,我要说,我已经这样做了,我不知道这里出了什么问题,所以任何建议都会很受欢迎。FULL OUTER JOIN抛出错误“包裹在括号中选择”

我正在尝试创建一个漏斗,可以更加精确地将新旧客户分类。漏斗中共有3个级别,因为“简单”我只会显示两个级别。

SELECT 
COUNT(s0.firstHit) AS pageId1, 
SUM(s0.exit) AS pageId2, 
COUNT(s1.firstHit) AS pageId3, 
SUM(s1.exit) AS pageId4 
FROM(
    SELECT 
    s0.fullVisitorId, 
    s0.visitId, 
    s0.firstHit, 
    s0.exit, 
    s1.firstHit, 
    s1.exit 
    FROM (
    SELECT 
     fullvisitorid, 
     visitid, 
     (SELECT MIN(hitNumber) FROM UNNEST(hits) WHERE REGEXP_CONTAINS(page.pagePath, r'pageId')) AS firstHit, 
     (SELECT MAX(IF(isExit, 1, 0)) FROM UNNEST(hits) WHERE REGEXP_CONTAINS(page.pagePath, r'pageId')) AS exitFlag 
    FROM 
     `<ID>.ga_sessions_2017*` 
    WHERE 
     _TABLE_SUFFIX BETWEEN '0601' AND '0602' 
     AND 1 = 1 
     AND EXISTS(SELECT 1 FROM UNNEST(hits) WHERE REGEXP_CONTAINS(page.pagePath, r'pageId')) 
    AND EXISTS(SELECT 1 FROM UNNEST(hits) hits WHERE (SELECT COUNT(value) FROM UNNEST(hits.customDimensions) custd WHERE index=20) > 0) 
    AND totals.visits = 1 
    GROUP BY 
    fullVisitorId, 
    visitId) AS s0 
    FULL OUTER JOIN EACH(
    SELECT 
    fullVisitorId, 
    visitId, 
    (SELECT MIN(hitNumber) FROM UNNEST(hits) WHERE REGEXP_CONTAINS(page.pagePath, 'pageId')) AS firstHit, 
    (SELECT MAX(IF(isExit, 1, 0)) FROM UNNEST(hits) WHERE REGEXP_CONTAINS(page.pagePath, 'pageId')) AS exitFlag 
    FROM 
    `<ID>.ga_sessions_2017*` 
    WHERE 
    _TABLE_SUFFIX BETWEEN '0601' AND '0602' 
    AND totals.visits = 1 
    GROUP BY 
    fullVisitorId, 
    visitId) AS s1 
ON 
    s0.fullVisitorId = s1.fullVisitorId 
    AND s0.visitId = s1.visitId) s01  
+0

我不知道什么是错的,而我整天都在盯着SQL查询。话虽如此,我会建议您将查询拆分成较小的部分并分别单独运行。然后建立起来,直到它再次破裂。 –

+0

查询的最上面部分本身就起作用。只有当我添加完整的外连接时,它才会令人不快。我会给它做一个更简单的电话。 – Sofu5

+0

“EACH”在这里做什么? –

回答

1

你可以找到写这个查询的方法,而不是让JOIN操作继续。

例如:

SELECT 
    fullvisitorid, 
    visitid, 
    (SELECT MIN(hitNumber) FROM UNNEST(hits) WHERE REGEXP_CONTAINS(page.pagePath, r'pageId')) AS firstFunnelHit, 
    (SELECT MAX(IF(isExit, 1, 0)) FROM UNNEST(hits) WHERE REGEXP_CONTAINS(page.pagePath, r'pageId')) AS firstExitFunnelFlag, 
    (SELECT MIN(hitNumber) FROM UNNEST(hits) WHERE (REGEXP_CONTAINS(page.pagePath, r'pageId')) OR ((select count(1) from unnest(hits) h, unnest(h.customDimensions) custd where custd.index = 20) > 0)) secondFunnelHit, 
    (SELECT MAX(IF(isExit, 1, 0)) FROM UNNEST(hits) WHERE REGEXP_CONTAINS(page.pagePath, r'pageId') OR ((select count(1) from unnest(hits) h, unnest(h.customDimensions) custd where custd.index = 20) > 0)) AS secondFunnelExitFlag 
FROM `dataset.ga_sessions_2017*` 
WHERE 1 = 1 
    AND _TABLE_SUFFIX BETWEEN '0601' AND '0602' 
    AND totals.visits = 1 

注意,在短短的一个SELECT你可以把关于谁一直在这一页和index=20打响customDimension谁一直在网页“PAGEID”所有游客也访问者的信息。

对于漏斗分析中的每一步,您都可以将新列作为结果,例如firstFunnelHitsecondFunnelHit

通过避免昂贵的JOIN s,您可以查询多达数据的数据,并在几秒钟内仍然有结果。

+0

谢谢你,你是最棒的,这是有效的,我也学到了很多东西,太棒了! – Sofu5

0

在过去的子查询:

SELECT 
    fullVisitorId, 
    visitId 
    (SELECT MIN(hitNumber) FROM UNNEST(hits) WHERE REGEXP_CONTAINS(page.pagePath, 'pageId')) AS firstHit, 
    (SELECT MAX(IF(isExit, 1, 0)) FROM UNNEST(hits) WHERE REGEXP_CONTAINS(page.pagePath, 'pageId')) AS exitFlag 
    FROM 
    `<ID>.ga_sessions_2017*` 
    WHERE 
    _TABLE_SUFFIX BETWEEN '0601' AND '0602' 
    AND totals.visits = 1 
    GROUP BY 
    fullVisitorId, 
    visitId 

它看起来对我来说,你需要在第三行visitId后一个逗号。

祝你好运。

+0

不幸的是,这并没有使它工作 – Sofu5

0

使用标准SQL时没有EACH关键字;这是特定于传统SQL的。删除这个词,你的查询可能会起作用。

+0

我试过这让它给:'错误:每个函数参数是一个表达式,而不是一个查询。要将查询用作表达式,查询必须用额外的括号包装以使其成为标量子查询表达式。在[35:8]' – Sofu5