如何在Google Big Query Standard SQL中查询重复记录中的重复记录

时间:2017-05-03 18:46:31

标签: sql google-bigquery

'命中'是一个重复的记录。所以' hits.customDimensions'在'点击'。

我在标准SQL中有这个Google Big Query:

SELECT    

       visitNumber,
       h.time, h.hour, h.minute,  
       h.page.PagePath,   


      h.customDimensions.value as language,  /* not working */ 


             from   
                `550335029.ga_sessions_*` , UNNEST(hits) as h  
             where               
                 h.customDimensions.index = 3  /* not working */ 

我正在寻找访问hits.customDimensions.index和hits.customDimensions.value的正确语法。如果我删除了两个不工作的'查询运行的行。

错误如下所示:

GenericGBQException: Reason: invalidQuery, Message: Cannot access field customDimensions on a value with type ARRAY<STRUCT<hitNumber INT64, time INT64, hour INT64, ...>> at [40:46]

2 个答案:

答案 0 :(得分:1)

在下面尝试BigQuery Standard SQL

  
SELECT
  visitNumber,
  h.time,
  h.hour,
  h.minute,
  h.page.PagePath,
  d.value AS language
FROM
  `550335029.ga_sessions_*`,
  UNNEST(hits) AS h,
  UNNEST(h.customDimensions) AS d
WHERE d.index = 3 

答案 1 :(得分:1)

我还发现,使用标准SQL时可以观察到性能提升,并避免一些unnesting操作(但这取决于您的操作)。

作为一个例子,这是解决这个问题的另一种方法:

SELECT
  visitNumber,
  h.time,
  h.hour,
  h.minute,
  h.page.PagePath,
  (select value from unnest(h.customDimensions) where index = 3) AS LANGUAGE
FROM
  `550335029.ga_sessions_*`,
  UNNEST(hits) AS h
WHERE 1 = 1
AND REGEXP_EXTRACT(_table_suffix, r'.*_(.*)') BETWEEN FORMAT_DATE("%Y%m%d", DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))
AND FORMAT_DATE("%Y%m%d", DATE_SUB(CURRENT_DATE(), INTERVAL 0 DAY))
and exists(select 1 from unnest(h.customDimensions) dim where dim.index = 3)

你现在所做的事情并没有太大的区别,但要记住在BQ中运行的不同技术很有意思,因为它们最终会使你的查询速度提高几十倍。