在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
解决方案: |
|
|
|
|
|