Session 在BigQuery(遗留SQL)中查找会话中的最大命中数

Session 在BigQuery(遗留SQL)中查找会话中的最大命中数,session,google-bigquery,Session,Google Bigquery,在使用GA数据的BigQuery中,我试图找到一个用户的每个会话在会话中的最大点击次数的页面类型(基于pagepath)。这将用于确定会话中哪个页面类型的活动最多(我只想要一个,因此最大) 使用行号为会话中的每个页面类型分配排名,过滤排名1对一个用户有效。当我尝试为更大的数据集(约400GB)复制该数据集时,会出现“资源已超过…”错误 我是BigQuery的新手,希望您能给我一些优化这段代码的建议 SELECT userid, sessionid, pagetype,

在使用GA数据的BigQuery中,我试图找到一个用户的每个会话在会话中的最大点击次数的页面类型(基于pagepath)。这将用于确定会话中哪个页面类型的活动最多(我只想要一个,因此最大)

使用行号为会话中的每个页面类型分配排名,过滤排名1对一个用户有效。当我尝试为更大的数据集(约400GB)复制该数据集时,会出现“资源已超过…”错误

我是BigQuery的新手,希望您能给我一些优化这段代码的建议

SELECT
    userid,
    sessionid,
    pagetype,
    hits
  FROM (
    SELECT
      *,
      ROW_NUMBER() OVER (PARTITION BY userid, sessionid ORDER BY sessionid ASC) rnk
    FROM (
      SELECT
        userid,
        sessionid,
        pagetype,
        COUNT(1) AS hits
      FROM
        [xxxxxxx] WHERE
       GROUP BY
        userid,
        sessionid,
        pagetype
      ORDER BY
        sessionid,
        hits DESC ) )
  WHERE
    rnk = 1
使用,可以编写查询,例如:

#standardSQL
SELECT
  first_session.*
FROM (
  SELECT
    ARRAY_AGG(
      STRUCT(userid, sessionid, pagetype, hits)
      ORDER BY sessionid ASC LIMIT 1
    )[OFFSET(0)] AS first_session
  FROM (
    SELECT
      userid,
      sessionid,
      pagetype,
      COUNT(*) AS hits
    FROM `xxxxxxx`
    GROUP BY
      userid,
      sessionid,
      pagetype
  )
  GROUP BY userid, sessionid
);
这将为每个组构建一个包含相关列的结构,并仅选择第一个,由
sessionid

确定,使用,您可以编写如下查询:

#standardSQL
SELECT
  first_session.*
FROM (
  SELECT
    ARRAY_AGG(
      STRUCT(userid, sessionid, pagetype, hits)
      ORDER BY sessionid ASC LIMIT 1
    )[OFFSET(0)] AS first_session
  FROM (
    SELECT
      userid,
      sessionid,
      pagetype,
      COUNT(*) AS hits
    FROM `xxxxxxx`
    GROUP BY
      userid,
      sessionid,
      pagetype
  )
  GROUP BY userid, sessionid
);

这将为每个组构建一个包含相关列的结构,并仅选择第一个列,这由
sessionid

确定如果您是BigQuery新手,为什么要使用传统SQL?例如,使用标准SQL意味着您可以使用带有ORDERBY和LIMIT的ARRAY_AGG。如果您不熟悉BigQuery,为什么要使用传统SQL?例如,使用标准SQL意味着您可以将ARRAY_AGG与ORDER BY和LIMIT一起使用。