繁体   English   中英

BigQuery:使用标准sql查询

[英]BigQuery: Querying with standard sql

我有这张桌子:

client_id   session_id  time    action  transaction_id  
------------------------------------------------------
1   1   15:01   view    NULL    
1   1   15:02   basket  NULL    
1   1   15:03   basket  NULL    
1   1   15:04   purchase    1   
1   2   15:05   basket  NULL    
1   2   15:06   purchase    2   
1   2   15:07   view    NULL    

我想在会话中,对所有先前的操作进行首次注册的transaction_id的注册(因此在15:03 transaction_id = NULL)

session_id  time    transaction_id  
------------------------------------
1   15:01   1   
1   15:02   1   
1   15:03   NULL    
1   15:04   1   
2   15:05   2   
2   15:06   2   
2   15:07   NULL    

嗯。 假设每个会话只有一个事务ID,则可以使用窗口函数:

select t.*,
       (case when row_number() over (partition by client_id, session_id, action
                                     order by time) = 1
             then max(transactc
ion_id) over (partition by client_id, session_id)
        end) as new_transaction_id
from t

以下是BigQuery标准SQL

#standardSQL
SELECT 
  client_id, session_id, time, action,
  (CASE 
    WHEN ROW_NUMBER() 
         OVER (PARTITION BY client_id, session_id, grp, action ORDER BY time) = 1
    THEN MAX(transaction_id) OVER (PARTITION BY client_id, session_id, grp) END
  ) AS transaction_id
FROM (
  SELECT *, 
    COUNTIF(transaction_id IS NOT NULL) 
      OVER(PARTITION BY client_id, session_id 
      ORDER BY time ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS grp
  FROM YourTable
)
-- ORDER BY client_id, session_id, time  

您可以如下测试虚拟数据的播放

#standardSQL
WITH YourTable AS (
  SELECT 1 AS client_id, 1 AS session_id, '15:01' AS time, 'view' AS action, NULL AS transaction_id UNION ALL
  SELECT 1, 1, '15:02', 'basket', NULL UNION ALL
  SELECT 1, 1, '15:03', 'basket', NULL UNION ALL
  SELECT 1, 1, '15:04', 'purchase', 1 UNION ALL
  SELECT 1, 1, '15:05', 'basket', NULL UNION ALL
  SELECT 1, 1, '15:06', 'basket', NULL UNION ALL
  SELECT 1, 1, '15:07', 'purchase', 3 UNION ALL
  SELECT 1, 2, '15:08', 'basket', NULL UNION ALL
  SELECT 1, 2, '15:09', 'purchase', 2 UNION ALL
  SELECT 1, 2, '15:10', 'view', NULL 
)
SELECT 
  client_id, session_id, time, action,
  (CASE 
    WHEN ROW_NUMBER() 
         OVER (PARTITION BY client_id, session_id, grp, action ORDER BY time) = 1
    THEN MAX(transaction_id) OVER (PARTITION BY client_id, session_id, grp) END
  ) AS transaction_id
FROM (
  SELECT *, 
    COUNTIF(transaction_id IS NOT NULL) 
      OVER(PARTITION BY client_id, session_id 
      ORDER BY time ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS grp
  FROM YourTable
)
-- ORDER BY client_id, session_id, time  

产量符合预期

client_id   session_id  time    action      transaction_id   
1           1           15:01   view        1    
1           1           15:02   basket      1    
1           1           15:03   basket      null     
1           1           15:04   purchase    1    
1           1           15:05   basket      3    
1           1           15:06   basket      null     
1           1           15:07   purchase    3    
1           2           15:08   basket      2    
1           2           15:09   purchase    2    
1           2           15:10   view        null     

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM