在 CTE 的 BigQuery 中使用 row_number()

Use row_number() in BigQuery in CTE

我试图在此查询中包含每个 orderId 的行号,但在选择子查询中的列时收到一条错误消息,提示“无法识别的名称:BQ”。我没有用太多,所以不确定我在哪里做错了。有人能看到吗?

     WITH BQ AS(
        SELECT 
        (SELECT customDimensions.value FROM UNNEST(t.customDimensions)
        AS customDimensions WHERE customDimensions.index = 6) as
        orderId_bq, 
        hits.eventinfo.eventaction as event_action, 
        hits.transaction.transactionId as trx_id, 
        hits.page.pagePath as page, 
        hitnumber AS hitnumber 
    
    FROM `xxxxx-xxxx.xxxxxx.ga_sessions_20210801` t,
    
    UNNEST(HITS) as hits 
    WHERE (SELECT customDimensions.value FROM UNNEST(t.customDimensions) AS customDimensions WHERE customDimensions.index = 8) = 'se'
    AND (SELECT customDimensions.value FROM UNNEST(t.customDimensions) AS customDimensions WHERE customDimensions.index = 4) = 'soffadirekt'
    --AND hits.eventinfo.eventaction IN ('complete purchase')
    --AND hits.transaction.transactionId IS NULL
    --and hits.page.pagePath != '/backend-transaction'
    --and hits.eventinfo.eventaction != 'backend transaction' )
    
    )
       
    SELECT 
    BQ.event_action,
    BQ.trx_id,
    BQ.page,
    BQ.hitnumber,
    
    FROM (SELECT Row_number()
            OVER( PARTITION BY BQ.orderId_bq
            ORDER BY BQ.hitnumber) as RN,
            BQ.orderId_bq
    
    from BQ
)

我也尝试过这个,但是它没有重新识别 'flat.orderId':

WITH BQ AS

(SELECT 
(SELECT customDimensions.value FROM UNNEST(t.customDimensions) AS customDimensions WHERE customDimensions.index = 6) as orderId_bq,
hits.eventinfo.eventaction as event_action,
hits.transaction.transactionId as trx_id,
hits.page.pagePath as page,
hitnumber AS hitnumber 

FROM `xxxx-xxxxxxxx.ga_sessions_20210801` t,
UNNEST(HITS) as hits 
WHERE (SELECT customDimensions.value FROM UNNEST(t.customDimensions) AS customDimensions WHERE customDimensions.index = 8) = 'se'
AND (SELECT customDimensions.value FROM UNNEST(t.customDimensions) AS customDimensions WHERE customDimensions.index = 4) = 'soffadirekt'

),

flat AS (
SELECT 
*
from bq
)

SELECT 
flat.orderId_bq,
flat.event_action,
flat.trx_id,
flat.page,
flat.hitnumber, 
FROM (SELECT Row_number()
        OVER( PARTITION BY flat.orderId_bq
        ORDER BY flat.hitnumber) as RN,

flat.orderId_bq,
flat.event_action,
flat.trx_id,
flat.page,
flat.hitnumber 

FROM flat
)

错误 Unrecognized name: BQ 发生是因为您正在尝试查询不存在的 BQ.*,因为您没有在子查询中添加 BQ 别名。添加 AS BQ 应该有效。查看查询:

SELECT 
BQ.event_action,
BQ.trx_id,
BQ.page,
BQ.hitnumber,

FROM (SELECT Row_number()
        OVER( PARTITION BY BQ.orderId_bq
        ORDER BY BQ.hitnumber) as RN,
        BQ.orderId_bq
        FROM BQ) AS BQ

只是一个建议,使用不同的别名可能会更好,这样您的查询将更具可读性。

我使用我的 table 测试了这个,我在我的子查询中添加了 AS subq1。看一个简单的测试:

WITH subq1 AS (SELECT amount_paid,customer from `my-project.test_dataset.myTable`)

SELECT
  subq1.RN,
  subq1.customer,
  subq1.amount_paid
FROM
  (SELECT ROW_NUMBER() 
    OVER(ORDER BY subq1.amount_paid) as RN,
    subq1.customer,
    subq1.amount_paid 
    FROM subq1) AS subq1
  LIMIT 3

结果:

有效的查询:

WITH raw AS 

(SELECT 
(SELECT customDimensions.value FROM UNNEST(t.customDimensions) AS customDimensions WHERE customDimensions.index = 6) as orderId_bq, 
    hits.eventinfo.eventaction as event_action, 
    hits.transaction.transactionId as trx_id, 
    hits.page.pagePath as page, 
    hitnumber AS hitnumber 

FROM `xxx-xxx.xxxxxx.ga_sessions_*` t,
UNNEST(HITS) as hits 
WHERE (SELECT customDimensions.value FROM UNNEST(t.customDimensions) AS customDimensions WHERE customDimensions.index = 8) = 'se'
AND (SELECT customDimensions.value FROM UNNEST(t.customDimensions) AS customDimensions WHERE customDimensions.index = 4) = 'soffadirekt'
AND _TABLE_SUFFIX BETWEEN '20211001' AND '20211002'

)

SELECT
raw.event_action,
raw.orderId_bq,
raw.trx_id,
raw.page,
raw.hitnumber,

FROM
(SELECT ROW_NUMBER() 
OVER(ORDER BY raw.hitnumber DESC) as RN,
raw.event_action,
raw.orderId_bq,
raw.trx_id,
raw.page,
raw.hitnumber

FROM raw) AS raw