BigQuery - 按第二个表中存在的值过滤数据

Posted

技术标签:

【中文标题】BigQuery - 按第二个表中存在的值过滤数据【英文标题】:BigQuery - filter data by values present in a second table 【发布时间】:2017-04-18 13:36:12 【问题描述】:

我需要从一个表中过滤谷歌分析数据,并按第二个表中的数据进行过滤。

我使用的查询如下:

SELECT 
fullvisitorid,visitNumber,

max(case when hits.customdimensions.index = 30 then 
hits.customdimensions.value end) login_id

FROM [table_1]
GROUP EACH BY fullvisitorid,visitNumber

我有第二个表 table_2,其中包含一个特别感兴趣的 login_id 列表(它们只是 table_1 中的一小部分)。 我想做的是通过table_2中包含的login_id过滤table_1中的数据,所以当我查询table_1时只返回那些login_id。 感谢所有帮助。

编辑:

上述查询返回一个如下所示的表(来自 table_1 的数据):

Row fullvisitorid       visitNumber  login_id    
10  8812091098272426348    1         
11  8812203501855327426    3         
12  8813941868399328770    15        
13  8814004579217219789    1         
14  8814073006630329047    102       6kena7aeq1sc312porfhyf  
15  8814073006630329047    103       6kena7aeq1sc312porfhyf  
16  8814200803368464684    257       
17  8814344603188097744    1         
18  8814410578161636902    94        

Table_2 如下所示:

Row login_id     
1   user_id  
2   00015mY5EVDsSgFlDDq3EU   
3   006rcSwDU1r8fiGnCIBCOZ   
4   008ZM8TeCwo3V8Lcyip3rT   
5   008nzvMgSF4Ir94ja04lXl   
6   00DFrm85sK0tDUm96Kedkw   
7   00GLa0WE0sq1Np4bvtmL9j

当我测试以下内容时,我收到一条错误消息,上面写着“无法对重复字段 hits.customdimensions.value 进行分区”。我怀疑使用 case/end 可能会把事情搞砸。

SELECT 
fullvisitorid,visitNumber,

max(case when hits.customdimensions.index = 30 then 
hits.customdimensions.value end) as login_id

FROM [table_1] as t1
inner join [table_2] as t2 on t2.login_id 
= t1.hits.customdimensions.value

GROUP EACH BY fullvisitorid,visitNumber

感谢任何帮助。期望的结果是只返回 table_1 中 login_id 与 table_2 匹配的数据。

【问题讨论】:

【参考方案1】:

在下面尝试(它适用于 BigQuery Legacy SQL,因为它是您的问题所在)

#legacySQL
SELECT
  fullvisitorid, 
  visitNumber,
  t2.login_id AS login_id
FROM (
  SELECT 
    fullvisitorid, 
    visitNumber,
    MAX(CASE WHEN hits.customdimensions.index = 30 
      THEN hits.customdimensions.value END
    ) AS login_id
  FROM [table_1]
  GROUP BY fullvisitorid, visitNumber
) AS t1
JOIN [table_2] AS t2
ON t2.login_id = t1.login_id

【讨论】:

【参考方案2】:
select 
    t1.fullvisitorid,
    t1.visitNumber
FROM        
    (SELECT 
    fullvisitorid,visitNumber,

    max(case when hits.customdimensions.index = 30 then 
    hits.customdimensions.value end) login_id

    FROM [table_1]) as t1
inner join [table_2] as t2 on t2.login_id = t1.login_id
GROUP EACH BY fullvisitorid,visitNumber

或许应该是

 inner join [table_2] as t2 on t2.login_id = t1.hits.customdimensions.value

无论如何,内部连接是您需要的解决方案。

【讨论】:

感谢您的帮助,感觉好像我到了某个地方;但现在它抛出了“无法加入重复字段 hits.customDimensions.value”。有什么想法吗? 嗯,实际上你可以尝试加入子查询(更新了答案)。可能您还需要将 GROUP EACH BY 移动到子查询

以上是关于BigQuery - 按第二个表中存在的值过滤数据的主要内容,如果未能解决你的问题,请参考以下文章

Excel:使用一个表中的值在第二个表中查找值

对第二个表中不存在 ID 的两个表的 MySQL 查询优化

大查询:加入第二个表中的单个最新行

MYSQL:我想用另一个表中的值更新表中的所有行,其中第一个表中的值等于第二个表

如果第二个表不存在连接,Mysql 使用一个表中的列值

删除第二个表中不包含的记录