2017-07-06 126 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