通过 sql 中的结果获取组的百分比

问题描述 投票:0回答:1

我有一张表,它用如下标签存储友谊

id | userid | friendid | tag
1    123       124         a
2    123       125         b
3    211       212         c
4    213       214         d
5    215       216         e

现在,我想知道人们给他们的朋友设置标签的频率的百分比。就像用户 123 一样,他为 2 个用户设置了 2 个标签,对于用户 211/213/215 他们只设置了一次标签。

我试过这样的查询

SELECT "userid", COUNT(*) as frequency
FROM "tag"
group by "tag"`

我得到这样的结果

userid  | frequency
123        2
211        1
215        1

但是如何得到结果的百分位呢?

我尝试了几个查询但无法得到结果。

mysql sql group-by percentile
1个回答
0
投票

如果你使用的是MySQL 8.0+,它增加了window function支持,你可以使用window function分几步得到结果。

Step 1. 按userid分组并计算每个userid的频率,

Step 2. 使用窗口函数按频率对用户进行排名,一路计算每个排名我们有多少用户。

Step 3. 使用窗口函数计算每个排名的百分位值。

Step 4. 加入用户频次与rank百分位值,并按rank_num排序得到你需要的结果。

这里是查询(在 MySQL 8.0 中测试):

with tag_with_rank AS(
select
    userid,
    count(1) as frequency,
    rank() over (order by count(1) desc) as rank_num,
    count(1) over (partition by count(1)) as rank_cnt
from
   tag
group by userid
),
rank_percitle AS (
SELECT
    rank_num,
    rank_cnt,
    (sum(rank_cnt) over(order by rank_num desc) / sum(rank_cnt) over()) as precentile
from 
    tag_with_rank
group by rank_num, rank_cnt
)
SELECT
    r.userid,
    r.frequency,
    p.precentile
FROM
    tag_with_rank r
JOIN
    rank_percitle p
on
    r.rank_num = p.rank_num
order by r.rank_num, r. userid
用户名 频率 百分位数
123 2 1.0000
211 1 0.7500
213 1 0.7500
215 1 0.7500
© www.soinside.com 2019 - 2024. All rights reserved.