【发布时间】:2020-01-16 16:32:30
【问题描述】:
我有一张游戏日志表。像这样:
Level Shuffle_Count
1 3
2 1
2 2
2 1
3 0
3 4
这意味着每当用户玩关卡时,都会在表格中添加一行。这些行的级别数据显示用户播放了哪个级别,而 shuffle_count 数据显示在该级别期间发生了多少次随机播放。
我想通过计算每个级别的 shuffle_count 的中值来知道每个级别发生了多少次 shuffle。在下面的代码中,我可以分别找到 2 级的中位数。首先,我创建了一个临时表,它对 shuffle_counts 进行排序,并将它们分成 4 个带有 ntile 的偶数组。然后我在名为 quartile 的新列中选择值为 3 的 min shuffle_count。
with ranked_test as (
SELECT shuffle_count, ntile(4) OVER (ORDER BY shuffle_count) AS quartile FROM ch.public.game_log WHERE level = 2
)
SELECT min(shuffle_count) FROM ranked_test
WHERE quartile = 3
GROUP BY quartile;
这是在选择 min shuffle_count 之前创建的表,其中 quartile = 3(大约是中位数):
Shuffle_Count quartile
0 1
0 1
2 2
3 2
4 3
8 3
12 4
19 4
到目前为止一切顺利。但问题是我有超过 1000 个级别,我无法为每个级别手动执行此操作。我需要从 1 到 1000 的每个级别的 shuffle_count 的中值。我知道这可以通过 PostgreSQL 9.4 中的一行来完成,但不幸的是我现在没有这个选项。
我无法通过简单的 Group By 来实现这一点。我想我需要更复杂的查询,包括 FOR 或其他东西。
你们有什么想法吗,伙计们?提前致谢。
【问题讨论】:
-
使用
ntile(4)计算中位数似乎很神秘。为什么不使用ntile(2)?为什么不使用更新版本的 Postgres?
标签: sql postgresql postgresql-9.1 postgresql-9.3 postgresql-9.2