mysql - 如何根据用户 ID 和 ID 访问的级别数使用 Google BigQuery 查找中位数?
问题描述
我有大约 100,000 个用户 ID,他们正在访问 n 个级别。我需要找到每个用户访问的用户和级别的总体中位数。
我尝试根据每个级别的 ID 数量和启动应用程序的 ID 总数来使用 AVG。值变化很大。
查找启动应用程序的 ID。
SELECT
event_names, COUNT(DISTINCT id) uniques, COUNT(id) AS total
FROM xyz.analytics_111.xyz
WHERE (date BETWEEN "20191018" AND "20191024") AND version = "3.1" AND event_names in ("app_open","internet") AND platform = "ANDROID"
AND id IN ( SELECT DISTINCT id FROM abc.analytics_111.abc WHERE event_names = "internet" AND internet_status = 1 )
GROUP BY event_names
查找每个级别的总用户数。
SELECT event_names, story_name, level, COUNT(DISTINCT id) uniques, COUNT(id) AS total
FROM xyz.analytics_111.xyz WHERE (date BETWEEN "20191018" AND "20191024") AND version = "3.1" AND event_names in ("start_level","end_level") AND platform = "ANDROID" AND id IN ( SELECT DISTINCT id FROM abc.analytics_111.abc
WHERE event_names = "internet" AND internet_status = 1 )
GROUP BY event_names, story_name, level ORDER BY event_names DESC, story_name, level
在此之后,我将所有级别的用户 ID 总数除以启动应用程序的用户 ID 数,以获得每个用户访问的级别的 AVG。有没有办法找到中位数?
解决方案
该问题没有足够的详细信息来提供完整的答案,但是您提供了以下要素:
- 不要使用
AVG
,当你想要的时候MEDIAN
要计算中位数,您可以执行以下操作:
SELECT level_id, fhoffa.x.median(ARRAY_AGG(some_number))
FROM `table`
GROUP BY level_id
bqutil.fn.median()
是我们与世界共享的公共 UDF:
现在,如果您愿意,可以使用您提供的额外详细信息
获取每个用户访问的级别的 AVG
, 然后:
SELECT AVG(levels) avg_levels_for_users
FROM (
SELECT id user, COUNT(DISTINCT level) levels
FROM `....`
GROUP BY user
)
推荐阅读
- vb.net - 我无法使用 websocket 接收任何数据
- python - 我可以矢量化两个基于纬度/经度寻找最接近邮政编码的 for 循环吗?
- c - 另一个网格中的 Gtk.Grid 在窗口上不可见
- omnet++ - Omnet ++中NED中接口实体和门项之间的区别?
- flutter-layout - 在颤动中重复背景图案图像
- android - 如何防止触摸事件从视图到另一个视图?
- javascript - 如何访问它之外的 .then() 方法的变量?
- javascript - Typescript 代码不适用于 commonjs 风格的 require 语句
- android - Android 如何在 appwidget 中使用仪表包
- javascript - 无法使用我自己的功能删除 cookie