Dat*_*ter 7 sql google-analytics google-bigquery
对不起具体的问题,但我觉得我已经走到了尽头,因为我对SQL的了解并没有那么远.
从GoogleAnalytics原始数据的BigQuery实现中获得的数据如下所示:
|-visitId
|- date
|- (....)
+- hits
|- time
+- customDimensions
|- index
|- value
+- customMetrics
|- index
|- value
Run Code Online (Sandbox Code Playgroud)
我知道有一些点击总是会向GA发送一些数据.具体来说,我想要customDimensions.index = 43,customDimensions.index = 24和customMetrics.index = 14.要指定,Dimension 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))
Run Code Online (Sandbox Code Playgroud)
由customDimension.value分组(当index = 43时)我知道每次使用customMetrics.index = 14发送一个匹配时,同样的命中有customDimensions.index = 43,同样的方式,customDimensions.index = 24总是有一个customDimensions的.index = 43.我实际上设法创建一个SQL,它做我想要的,但代价是什么?它很大,很慢,很难看.我目前正在做的是:
我对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
Run Code Online (Sandbox Code Playgroud)
运行此查询需要花费太多时间来创建包含结果的propper仪表板.
如果这是我的最终结果,请帮助我.我觉得应该有一个更优雅的解决方案来解决这个问题,但我似乎无法自己找到它.
救命?
您应该能够使用 BigQuery 的作用域聚合(WITHIN 子句)构建此查询,而无需连接。这是一个小例子,可能不完全是您想要的逻辑,但应该说明一些可能性:
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
Run Code Online (Sandbox Code Playgroud)
该示例显示了三个WITHIN RECORD 聚合,这意味着它们将根据单个记录的重复字段进行计算。SOME() 采用布尔表达式,如果记录中的任何字段满足该表达式,则返回 true。因此,对于具有一次或多次 customDimensions.index = 43 命中的访问,has43 将为 true。HAVING 子句会过滤掉为 false 的记录。
SUM(IF(...)) 表达式计算索引 = 24 且值 = 'ficha' 的 customDimensions 的总数以及与索引 = 14 的 customMetrics 关联的总值。
| 归档时间: |
|
| 查看次数: |
2861 次 |
| 最近记录: |