mysql sql中按结果取分组的百分位数

zpgglvta  于 2023-03-11  发布在  Mysql
关注(0)|答案(1)|浏览(228)

我有一个表,其中存储的标签如下友谊

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

但是如何得到结果的百分位数呢?
我尝试了几次查询,但无法得到结果。

qf9go6mv

qf9go6mv1#

如果您使用的是MySQL 8.0+,它增加了window function支持,您可以使用窗口函数在几个步骤中获得结果。
步骤1.按用户标识分组并计算每个用户标识的频率,
第2步。使用窗口函数按频率对用户进行排名,计算每个排名中我们有多少用户。
步骤3.使用窗口函数计算每个等级的百分位值。
步骤4.将用户频率与排名百分位值连接起来,并按rank_num对它们进行排序,以获得您需要的结果。
下面是查询(tested in 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) / 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

| 用户识别码|频率|百分位数|
| - ------|- ------|- ------|
| 一百二十三|第二章|0.2500|
| 二一一|1个|1万|
| 二一三|1个|1万|
| 二一五|1个|1万|

相关问题