You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为多维度自定义Firebase事件统计唯一用户数?

解决BigQuery中Firebase事件多维度唯一用户统计问题

我完全懂你碰到的痛点——用APPROX_COUNT_DISTINCT做单维度统计没问题,但加多个维度分组后,它会把用户按分组切割,没法给出全局准确的唯一用户数。而HLL(HyperLogLog)的优势就是能先把用户标识转换成可合并的sketch结构,之后不管怎么筛选维度,都能通过合并sketch得到准确的去重结果,完美适配Data Studio的动态筛选需求。

下面是具体的解决方案:

第一步:生成带HLL Sketch的维度化视图

先创建一个视图,把所有你需要的维度(事件参数、用户地域、用户属性等)和对应的用户HLL Sketch存储起来。这样后续不管怎么筛选,都能基于这个视图快速计算唯一用户数:

CREATE OR REPLACE VIEW `project.info_project_TOTAL.event_user_sketches` AS
SELECT
  x.date AS event_date,
  x.name AS event_name,
  -- 提取事件关键参数维度
  (SELECT params.value.string_value FROM x.params WHERE params.key = 'grade') AS vl_grades,
  -- 用户地域与设备维度
  user_dim.geo_info.country AS user_country,
  user_dim.geo_info.region AS user_region,
  user_dim.geo_info.city AS user_city,
  user_dim.device_info.user_default_language AS user_language,
  user_dim.app_info.app_platform AS app_platform,
  -- 用户属性维度
  user_prop.key AS user_prop_key,
  user_prop.value.value.string_value AS user_prop_string_value,
  -- 事件计数(修正原查询的计数逻辑,避免UNNEST导致重复计数)
  COUNT(*) AS event_count,
  -- 生成每个维度组合对应的用户HLL Sketch
  HLL_COUNT.INIT(user_dim.app_info.app_instance_id) AS user_sketch
FROM 
  `project.info_project_TOTAL.TOTAL_results_jobs`,
  UNNEST(event_dim) AS x,
  UNNEST(user_dim.user_properties) AS user_prop
WHERE 
  x.name = 'Zlag_Click'
GROUP BY
  event_date,
  event_name,
  vl_grades,
  user_country,
  user_region,
  user_city,
  user_language,
  app_platform,
  user_prop_key,
  user_prop_string_value
ORDER BY 
  event_count DESC;

第二步:用HLL_COUNT.MERGE回答你的业务问题

基于上面的视图,你可以轻松通过筛选+合并sketch得到任意条件下的唯一用户数:

问题1:过去x天内,来自德国的触发事件的唯一用户数

SELECT
  HLL_COUNT.MERGE(user_sketch) AS unique_users
FROM
  `project.info_project_TOTAL.event_user_sketches`
WHERE
  event_date >= DATE_SUB(CURRENT_DATE(), INTERVAL x DAY)
  AND user_country = 'Germany';

问题2:过去x天内,触发难度等级为5的事件的唯一用户数

SELECT
  HLL_COUNT.MERGE(user_sketch) AS unique_users
FROM
  `project.info_project_TOTAL.event_user_sketches`
WHERE
  event_date >= DATE_SUB(CURRENT_DATE(), INTERVAL x DAY)
  AND vl_grades = '5'; -- 如果grade是数值类型,去掉引号即可

问题3:过去x天内,请求特定资源的唯一用户数

先给视图新增资源参数维度(假设事件参数里的key是resource):

CREATE OR REPLACE VIEW `project.info_project_TOTAL.event_user_sketches` AS
SELECT
  -- 保留原有所有字段
  x.date AS event_date,
  x.name AS event_name,
  (SELECT params.value.string_value FROM x.params WHERE params.key = 'grade') AS vl_grades,
  -- 新增特定资源参数
  (SELECT params.value.string_value FROM x.params WHERE params.key = 'resource') AS requested_resource,
  user_dim.geo_info.country AS user_country,
  -- ... 其他原有维度字段 ...
  COUNT(*) AS event_count,
  HLL_COUNT.INIT(user_dim.app_info.app_instance_id) AS user_sketch
FROM 
  `project.info_project_TOTAL.TOTAL_results_jobs`,
  UNNEST(event_dim) AS x,
  UNNEST(user_dim.user_properties) AS user_prop
WHERE 
  x.name = 'Zlag_Click'
GROUP BY
  -- 把新增参数加入分组
  event_date,
  event_name,
  vl_grades,
  requested_resource,
  -- ... 其他原有分组字段 ...
ORDER BY 
  event_count DESC;

然后查询特定资源的唯一用户数:

SELECT
  HLL_COUNT.MERGE(user_sketch) AS unique_users
FROM
  `project.info_project_TOTAL.event_user_sketches`
WHERE
  event_date >= DATE_SUB(CURRENT_DATE(), INTERVAL x DAY)
  AND requested_resource = 'your_target_resource';

适配Data Studio的技巧

把这个视图作为Data Studio的数据源后,你可以直接添加筛选器(比如国家、难度等级),然后创建一个计算字段:

HLL_COUNT_MERGE(user_sketch)

这样当你调整筛选条件时,Data Studio会自动合并符合条件的sketch,实时展示准确的唯一用户数。

内容的提问来源于stack exchange,提问作者Peter P

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:01:15