【问题标题】:Selecting different customDimensions on BigQuery integration of GA在 GA 的 BigQuery 集成中选择不同的 customDimensions
【发布时间】:2014-12-25 02:56:19
【问题描述】:

很抱歉这个具体问题,但我觉得我已经走到了死胡同,因为我对 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时的值
  • Left join 43 with 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 时购买了哪些产品。

这是我的代码:

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

运行此查询需要花费太多时间来创建带有结果的适当仪表板。

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

帮助?

【问题讨论】:

  • 也许这就是要走的路。

标签: sql google-analytics google-bigquery


【解决方案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

【讨论】:

    【解决方案2】:

    您应该能够通过使用 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。所以 has43 对于有一次或多次点击且 customDimensions.index = 43 的访问为真。HAVING 子句过滤掉为假的记录。

    SUM(IF(...)) 表达式计算 index = 24 和 value = 'ficha' 的 customDimensions 的总数以及与 index = 14 的 customMetrics 关联的总值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-17
      • 1970-01-01
      • 1970-01-01
      • 2016-04-29
      • 1970-01-01
      • 1970-01-01
      • 2021-01-13
      • 2017-08-14
      相关资源
      最近更新 更多