我有一张表,它用如下标签存储友谊
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 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 |