回答

收藏

在Postgresql中,如何按列选择前n%的行?

技术问答 技术问答 219 人阅读 | 0 人回复 | 2023-09-12

在Postgresql (版本10)中    ,以下sql选择的所有行顺序avg_grade。
& J6 p6 \4 q% W9 a4 v-- query - students list,order by average grade,select s.student_id,s.student_name,avg(ce.grade) as avg_gradefrom students as s       left join course_enrollment as ce on s.student_id = ce.student_idgroup by s.student_idorder by avg_grade desc NULLS LAST;相关表$ b3 F# b1 y- L. ^6 L
学生:4 a0 Y2 k4 a( E+ v: M
create table students (  student_id   bigserial                           not null primary key, student_name varchar(200)          not null, created      timestamp default CURRENT_TIMESTAMP not null);course_enrollment:- ~. N( N5 ^0 {# q9 i: E3 O
-- create table,create table course_enrollment(  course_id  bigint                              not null, student_id bigint                              not null, grade      float                               not null, created    timestamp default CURRENT_TIMESTAMP not null, unique (course_id,student_id));问题:
( \# A* Y6 N; j3 B' F; a! ]如何仅检索avg_grade值最高的前n%(例如10%)行?
9 q" T' d, T' @& S1 _' L4 ^想知道是否有窗口函数可以执行此操作,还是需要子查询?
顺便说一句:
' |# b  a3 v. v7 W) t9 q3 x( }3 w这与Postgresql不同:如何从每个组/类别中选择之前?n%(%) 因为那个人想在每组之前n%,因此,可以在中间使用分区window functions。 但这group by总体上最高n%,所以是必要的。                                                                9 J8 a. y& r* h" g: J6 h
    解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则