请问 SQL 怎么统计前四分之一的人数分数最大值,还有后四分之人数分数最大值?

2022-09-13 09:48:00 +08:00
 hemingyang

2857 次点击
所在节点    MySQL
16 条回复
sky857412
2022-09-13 09:52:10 +08:00
count 一下,除以 4 ,结合 order by ,offset limit max(score)
hemingyang
2022-09-13 10:08:41 +08:00
@sky857412 这个是 mysql 的写法吧, HAVING 但是好像不行
sqfphoenix
2022-09-13 10:29:55 +08:00
前四分之一 = 降序+limit(total/4)
后四分之一 = 升序+limit(total/4)
hemingyang
2022-09-13 10:44:06 +08:00
@sqfphoenix Oracle 没 limit 啊
kaicity
2022-09-13 10:51:09 +08:00
V2EX › MySQL

请问 SQL 怎么统计前四分之一的人数分数最大值,还有后四分之人数分数最大值?
dog82
2022-09-13 10:51:56 +08:00
是不是得用开窗函数?
hemingyang
2022-09-13 10:58:14 +08:00
@kaicity 没有看到 Oracle 节点, 就放在这个下面了~!
hemingyang
2022-09-13 10:59:02 +08:00
@dog82 没有思路 所以发帖问论坛大佬们
uianz
2022-09-13 11:02:29 +08:00
rownum 呢?
adoal
2022-09-13 11:04:39 +08:00
窗口函数,Oracle 里叫分析函数
weizhen199
2022-09-13 11:06:13 +08:00
这类函数 oracle 可能自己有
hemingyang
2022-09-13 11:11:16 +08:00
@uianz rownum 是固定值啊, 我要取得前四分之一 这个可能是动态的
kazarin
2022-09-13 11:18:01 +08:00
我寻思 oracle 也有 PERCENTILE()啊: https://docs.oracle.com/cd/E93962_01/bigData.Doc/eql_onPrem/src/reql_expr_percentile.html

简单做法一步一步来:
第一个 CTE ,用 PERCENTILE 获得四分之一和四分之三的分数;
第二个 CTE ,原始数据 JOIN 第一个 CTE ,WHERE 分数大于四分之三,SELECT 平均分;
第二个 CTE ,原始数据 JOIN 第一个 CTE ,WHERE 分数小于四分之一,SELECT 平均分;
lenmore
2022-09-13 11:29:16 +08:00
用 percent_rank 窗口函数,然后对 pct 分组,统计出各组的平均分。

e.g.
select floor(pct*100 /25) as grp, avg(n)
from (
select n, percent_rank() over(order by n) as pct
from public.global_number order by n
) as t
group by floor(pct*100 /25)
order by grp
haimianbihdata
2022-09-13 12:08:39 +08:00
开窗函数可以
xuanbg
2022-09-13 22:13:23 +08:00
子查询先查出前 1/4 和后 1/4 的数据,然后再计算结果。建议使用 with xxx as (select …… from ……)语法。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/879610

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX