我想在BigQuery中加入多个表,但是Joining multiple tables in bigquery的解决方案并没有帮助我得到我想要的输出 .
我的出发点如下 . 我正在创建5个单独的表,显示特定页面可能的每个评级值 . 请参阅此处的示例输出:
该表按以下方式创建:
#standardSQL
CREATE TEMPORARY FUNCTION tables_in_range(suffix STRING) AS (suffix BETWEEN (
SELECT
FORMAT_DATE('%y%m%d',
DATE('2018-06-01')))
AND (
SELECT
FORMAT_DATE('%y%m%d',
DATE('2018-06-30'))));
SELECT
h.page.pagePath AS page,
Count(h.eventInfo.eventLabel)as five_star
FROM
`table.ga_sessions_20*` AS t,
t.hits AS h
WHERE
h.eventInfo.eventAction='rating'
AND h.eventInfo.eventLabel ='5'
AND tables_in_range(_TABLE_SUFFIX)
AND REGEXP_CONTAINS(h.page.pagePath,
r'/xyz/')
AND h.type='EVENT'
group by 1
当按照此处所述加入表格时Joining multiple tables in bigquery我很遗憾没有得到预期的结果 . 相反,Join仅查看所有5个表共有的页面 - 这意味着这些页面的五个可能值中的每一个都具有1-5的评级 . 见下面的示例输出 . joint table results
select
five_star.page as page,
five_star.five_star as five_star,
four_star.four_star as four_star,
three_star.three_star as three_star,
two_star.two_star as two_star,
one_star.one_star as one_star
from five_star
join four_star using (page)
join three_star using (page)
join two_star using (page)
JOIN one_star using (page)
我希望通过我的加入实现的是这样一个表:desired output . 我看到的问题是,如果页面没有收到某个评级,它将不会在查询atm中加入 . 不幸的是,我无法找到Union all,Cross Join或者left join的解决方案,所以我非常感谢这里的任何支持!
3 回答
您的查询中的问题:您're only adding to those event pages, which had a 5-star rating. That'为什么建议使用full outer join - 它会向最左侧的表添加新行 .
我认为在您的情况下,解决方案更容易,根本不需要连接,因为所有数据都在同一个表中 . 这个是扁平的非枢轴:
如果你真的需要类似于pivot的列,它将如下所示:
而不是
SUM(IF(condition,1,0))
你也可以COUNT(IF(condition,1,NULL))
心连心!
以下是BigQuery Standard SQL
您可以使用您问题中的虚拟数据进行测试,使用上面的数据,如下所示
另一种选择是使用FULL JOIN,如下例所示
您可以使用您问题中的虚拟数据进行测试,使用上面的数据,如下所示
结果如预期: