FORQuery中的LOOP语句

时间:2018-03-19 13:02:56

标签: for-loop google-bigquery

我有两个表中的数据:

活动

User_ID       Event_Time       Cmd

AMsySZb9GPcL  1512125190721078  1
AMsySZYQ-lAI  1512118629594674  0
AMsySZZMlPzD  1512125736366076  1
....

行为

User_ID       Event_Time       

AMsySZZFezm   1512145788526664
AMsySZb9GPcL  1512125190721078
AMsySZY5YcTa  1512143509733637
AMsySZYQ-lAI  1512118629594674
AMsySZZMlPzD  1512125736366076
....

User_ID的类型为STRING,Event_Time的类型为INTEGER。

步骤1:我现在正在制作的基本SELECT语句是:

SELECT activity.User_ID, activity.Event_Time FROM activity WHERE Cmd=1        

步骤2:然后我想从行为表中获取数据,但仅适用于步骤1中的用户,且仅适用于activity.Event_Time在activity.Event_Time之前的位置。

例如: 从第1步开始,我得到了User_ID =' AMsySZb9GPcL'我需要:

SELECT behaviour.User_ID, behaviour.Event_Time
FROM behaviour 
WHERE User_ID='AMsySZb9GPcL' AND activity.Event_Time >= behaviour.Event_Time     

但问题是我必须为步骤1中的每个User_ID做同样的事情,我不确定它是否是SQL支持的功能,但我需要类似FOR LOOP的东西。

1 个答案:

答案 0 :(得分:1)

您不需要FOR LOOP - 当您处理任何类型的SQL时,您应该考虑基于集合的操作 - 这样您就可以使用JOIN s的强大功能一次性处理所有用户

以下是BigQuery Standard SQL

   
#standardSQL
SELECT 
  activity.User_ID User_ID, 
  activity.Event_Time activity_Time, 
  behaviour.Event_Time behaviour_Time
FROM `project.dataset.activity` activity
JOIN `project.dataset.behaviour` behaviour 
ON activity.User_ID = behaviour.User_ID
AND activity.Event_Time >= behaviour.Event_Time
WHERE Cmd = 1   

您可以使用示例中的虚拟数据来测试/播放上面的内容:

#standardSQL
WITH `project.dataset.activity` AS (
  SELECT 'AMsySZb9GPcL' User_ID, 1512125190721078 Event_Time, 1 Cmd UNION ALL
  SELECT 'AMsySZYQ-lAI', 1512118629594674, 0 UNION ALL
  SELECT 'AMsySZZMlPzD', 1512125736366076, 1 
), `project.dataset.behaviour` AS (
  SELECT 'AMsySZZFezm ' User_ID, 1512145788526664 Event_Time UNION ALL
  SELECT 'AMsySZb9GPcL', 1512125190721078 UNION ALL
  SELECT 'AMsySZY5YcTa', 1512143509733637 UNION ALL
  SELECT 'AMsySZYQ-lAI', 1512118629594674 UNION ALL
  SELECT 'AMsySZZMlPzD', 1512125736366076 
)
SELECT 
  activity.User_ID User_ID, 
  activity.Event_Time activity_Time, 
  behaviour.Event_Time behaviour_Time
FROM `project.dataset.activity` activity
JOIN `project.dataset.behaviour` behaviour 
ON activity.User_ID = behaviour.User_ID
AND activity.Event_Time >= behaviour.Event_Time
WHERE Cmd=1