mysql 如何使用Google BigQuery根据用户ID和ID访问过的级别数找到中位数?

ccgok5k5  于 2024-01-05  发布在  Mysql
关注(0)|答案(2)|浏览(115)

我有大约100,000名用户ID谁是访问n数量的水平。我需要找到的用户和每个访问水平的整体中位数。
我试过根据每个级别的ID数和启动应用程序的总ID数来使用AVG。值变化很大。
找出启动应用程序的人。

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的数量谁启动了应用程序,以获得平均水平访问的每个用户。有没有办法找到一个中位数?

m1m5dgzv

m1m5dgzv1#

这个问题没有足够的细节来给出一个完整的答案,但是有了你给我们的元素:

  • 不要使用AVG,当你需要MEDIAN

要计算中位数,您可以执行以下操作:

SELECT level_id, fhoffa.x.median(ARRAY_AGG(some_number))
FROM `table`
GROUP BY level_id

字符串
bqutil.fn.median()是我们与世界共享的公共UDF:

现在,根据你提供的额外细节,如果你想
获取每个用户访问的级别的平均值
,然后:

SELECT AVG(levels) avg_levels_for_users
FROM (
  SELECT id user, COUNT(DISTINCT level) levels
  FROM `....`
  GROUP BY user
)

emeijp43

emeijp432#

我建议使用APPROX_QUANTILES({field},4)[2]而不是fhoffa.x.median,因为在现实世界的大规模查询中,后者更有可能陷入“查询无法在分配的内存中执行”的麻烦。

相关问题