我有一个Google Analytics(分析)事件,该事件会在进行某些互动时在我的网站上触发,这可能会或可能不会触发会话中的用户,或者会触发多次。
我想返回每天显示用户ID以及第一个和最后一个事件标签的值的结果。我尝试使用MAX(hits.eventInfo.eventLabel)进行此操作,但是当我检查我的结果时,它没有像我期望的那样返回当天该用户的最后一个值。
SELECT Date,
customDimension.value AS UserID,
MAX(hits.eventInfo.eventLabel) AS last_value
FROM `project.dataset.ga_sessions_20*` AS t
CROSS JOIN UNNEST(hits) AS hits
CROSS JOIN UNNEST(t.customdimensions) AS customDimension
WHERE parse_date('%y%m%d', _table_suffix) between
DATE_sub(current_date(), interval 1 day) and
DATE_sub(current_date(), interval 1 day)
AND hits.eventInfo.eventAction = "Value"
AND customDimension.index = 2
GROUP BY Date, UserID
例如,上面的查询返回结果,其中用户X具有以下MAX()值:
20180806 User_x 69.96
但是当我查看当天用户互动的详细信息时,会发现:
基于此,我希望看到79.95作为我的MAX()结果,因为它具有最高的匹配次数,相反,我似乎已经从会话中间的某个位置选择了一个值-我该如何调整查询确保我选择了最后一个事件值?
答案 0 :(得分:2)
当您在执行GROUP BY时正在寻找列colA
的最大值时-MAX(colA)
显然可以工作
但是,当您根据列colA
中的最大值在列colB
中寻找值时-您应该使用STRING_AGG(colA ORDER BY colB DESC LIMIT 1)
或类似的方法来使用ARRAY_AGG()
因此,在您的情况下,我认为它将是以下内容(您应该对其进行进一步调整)
STRING_AGG(eventInfo.eventLabel ORDER BY hiNumber DESC LIMIT 1) AS last_value
答案 1 :(得分:1)
在您的情况下,应该使用hits数组中的子查询。这样可以完全控制您想要的东西。我使用了Google提供的示例ga数据,因此标签有所不同。但是我写的方式很容易修改以满足您的需求:
SELECT
date,
fullvisitorid,
visitstarttime,
(SELECT value FROM t.customDimensions WHERE index=2) userId,
(SELECT
--STRUCT(hour, minute, hitNumber, eventinfo.eventlabel) -- for testing, comment out next line
eventInfo.eventLabel
FROM t.hits
WHERE type='EVENT' AND eventInfo.eventAction <> '' -- modify to fit your condition
ORDER BY hitNumber ASC LIMIT 1
) AS firstEventLabel,
(SELECT
--STRUCT(hour, minute, hitNumber, eventinfo.eventlabel) -- for testing, comment out next line
eventInfo.eventLabel
FROM t.hits
WHERE type='EVENT' AND eventInfo.eventAction <> '' -- modify to fit your condition
ORDER BY hitNumber DESC LIMIT 1
) AS lastEventLabel
FROM
`bigquery-public-data.google_analytics_sample.ga_sessions_20170801` t
LIMIT 1000 -- for testing
基本上,我正在查询事件,这些事件按hitNumber升序或降序对其进行排序,并限制为一个,以使每行只有一个结果。带有userId的行还显示了如何正确获取自定义尺寸值。
如果您对使用数组的概念不熟悉,可以在这里了解所有信息:https://cloud.google.com/bigquery/docs/reference/standard-sql/arrays
答案 2 :(得分:0)
MAX()
应该可以工作。一次它将返回意外值的原因是它是对字符串而不是数字进行运算。
这可以解决问题吗?
MAX(CAST(hits.eventInfo.eventLabel as float128)) AS last_value