在GA的BigQuery集成上选择不同的customDimensions

时间:2014-10-29 11:58:23

标签: sql google-analytics google-bigquery

对于这个具体的问题感到抱歉,但我觉得自己已经走到了尽头,因为我对SQL的了解并没有那么远。

GoogleAnalytics原始数据的BigQuery实现产生的数据如下所示:

|-visitId
|- date
|- (....)
+- hits
   |- time
   +- customDimensions
      |- index
      |- value
   +- customMetrics
      |- index
      |- value

我知道有些点击总是向GA发送一些数据。具体来说,我想要customDimensions.index = 43,customDimensions.index = 24和customMetrics.index = 14。要指定,尺寸43是正在看到或出售的对象,尺寸24告诉我它们是否被看到和指标14,当它刚出售时该值为1。 我的最终结果应如下所示:

customDimension.value( when index=43)    count(when customDimension.index=24 and customDimension.value=='ficha')      count(when customMetrics.index=14 and customMetrics.value ==1))

由customDimension.value分组(当index = 43时) 我知道每次使用customMetrics.index = 14发送匹配时,相同的命中率为customDimensions.index = 43,同样,customDimensions.index = 24始终具有customDimensions.index = 43。 我实际上设法创建一个SQL,它做我想要的,但代价是什么?它很大,很慢,很难看。我目前正在做的是:

  • 创建三个表,所有表都有visitId,hit.time和index = 14,24,43时的值
  • 左连接43,其中24 ON 43.visitId == 24.visitId AND 43.hits.time == 24.hits.time
  • 左连接结果,14 ON 14.visitId == result.visitId AND 14.hits.time == result.hits.time

我对visitId或hits.time不感兴趣,它只是一种关联相同命中的方法(并且知道当customMetrics.index = 14和value = 1时他们购买了哪些产品。< / p>

这是我的代码:

SELECT Tviviendasvisitas.viviendaId as ViviendaID ,sum(Tviviendasvisitas.NumeroVisitas) as NumeroVisitas,sum(Ttransacciones.Transactions) as Transactions FROM (
SELECT Tviviendas.visitId as visitId, Tviviendas.hits.time as visitTime, Tviviendas.ViviendaID as viviendaId,Tvisitas.visitas as NumeroVisitas FROM (
SELECT  visitId,hits.time,hits.customDimensions.value as ViviendaID FROM ((TABLE_DATE_RANGE([-------.ga_sessions_], TIMESTAMP('2014-09-01'), TIMESTAMP('2014-09-30'))))
WHERE hits.customDimensions.index = 43 
GROUP EACH BY visitId,hits.time, ViviendaID)as Tviviendas

LEFT JOIN EACH(
SELECT  visitId,hits.time,count(*) as visitas FROM ((TABLE_DATE_RANGE([-------.ga_sessions_],  TIMESTAMP('2014-09-01'), TIMESTAMP('2014-09-30'))))
WHERE hits.customDimensions.index = 24 AND hits.customDimensions.value=='ficha'
GROUP EACH BY visitId,hits.time) as Tvisitas
ON Tvisitas.visitId==Tviviendas.visitId AND Tvisitas.time==Tviviendas.time) as Tviviendasvisitas

LEFT JOIN EACH (
SELECT  visitId ,hits.time as transactionTime, sum(hits.customMetrics.value) as Transactions FROM(TABLE_DATE_RANGE([-------.ga_sessions_], TIMESTAMP('2014-09-01'), TIMESTAMP('2014-09-30')))
WHERE hits.customMetrics.index = 14 AND hits.customMetrics.value=1
GROUP BY visitId, transactionTime) as Ttransacciones
ON Tviviendasvisitas.visitId==Ttransacciones.visitId AND Tviviendasvisitas.visitTime==Ttransacciones.transactionTime
GROUP BY ViviendaID

运行此查询需要花费太多时间来创建包含结果的propper仪表板。

如果这是我的最终结果,请帮助我。我觉得应该有一个更优雅的解决方案来解决这个问题,但我似乎无法自己找到它。

帮助?

2 个答案:

答案 0 :(得分:3)

通过使用BigQuery的范围聚合(the WITHIN clause),您应该能够在没有连接的情况下构建此查询。这是一个小例子,可能不是你想要的逻辑,但应该说明一些可能性:

SELECT  visitId, hits.time,
        SOME(hits.customDimensions.index = 43) WITHIN RECORD AS has43,
        SUM(IF(hits.customDimensions.index = 24 AND hits.customDimensions.value = 'ficha', 1, 0)) WITHIN RECORD AS numFichas,
        SUM(IF(hits.customMetrics.index = 14, hits.customMetrics.value, 0)) WITHIN RECORD AS totalValues
FROM ((TABLE_DATE_RANGE([-------.ga_sessions_], TIMESTAMP('2014-09-01'), TIMESTAMP('2014-09-30'))))
HAVING has43

该示例显示了三个WITHIN RECORD聚合,这意味着它们将在单个记录的重复字段上计算。 SOME()接受一个布尔表达式,如果记录中的任何字段满足该表达式,则返回true。因此,对于具有一个或多个使用customDimensions.index = 43的命中的访问,has43将成立.HAVING子句过滤出错误的记录。

SUM(IF(...))表达式计算indexD =且值=&#39; ficha&#39;的customDimensions总数。以及与index = 14的customMetrics相关联的总值。

答案 1 :(得分:-1)

如果您只想从hitLevel customDimension获取值并将其添加到自己的列,这是一个巧妙的技巧:

SELECT fullVisitorId, visitId, hits.hitNumber,
MAX(IF(hits.customDimensions.index=43, 
       hits.customDimensions.value, 
       NULL)) WITHIN hits AS product,
FROM [tableID.ga_sessions_20150305]
LIMIT 100