代码之家  ›  专栏  ›  技术社区  ›  Ben P

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

  •  1
  • Ben P  · 技术社区  · 7 年前

    我有一个谷歌分析事件,当我的网站上的某些互动时,这可能会或可能不会为一个用户在一个会话,或可以发射多次。

    我想每天返回显示用户I d和第一个和最后一个事件标签值的结果。我试着用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 回复  |  直到 7 年前
        1
  •  3
  •   Mikhail Berlyant    7 年前

    当您正在寻找列的最大值时 colA 很明显,在分组的时候 MAX(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
    
        2
  •  1
  •   Martin Weitzmann    7 年前

    在您的例子中,应该使用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

        3
  •  0
  •   Gordon Linoff    7 年前

    MAX() 应该有用。它只会返回一个意外值,如果它操作的是字符串,而不是数字。

    这能解决问题吗?

    MAX(CAST(hits.eventInfo.eventLabel as float128)) AS last_value