每天选择第一个和最后一个事件用户

时间:2018-08-07 08:30:43

标签: sql google-bigquery

我有一个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

但是当我查看当天用户互动的详细信息时,会发现:

enter image description here

基于此,我希望看到79.95作为我的MAX()结果,因为它具有最高的匹配次数,相反,我似乎已经从会话中间的某个位置选择了一个值-我该如何调整查询确保我选择了最后一个事件值?

3 个答案:

答案 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