SQL PARTITION BY的用法

现有一数据表test,结构如下

studentnamecoursenamemark
aa80
ab60
ac30
ba40
bb50
bc58
ca60
cb70
cc88
da90
db70
dc88

1 查出每门功课的前一名(并列名次问题)


select * from (
select *,ROW_NUMBER() over(partition by coursename order by mark desc) ranks
from test_a
) a
where a.ranks=1


partition by :分区;按coursename分区,依据mark排序 即可得到每门课程的第一名,同理改变条件可获得前三名、前五名等。

2 查出至少两门功课达到60分的学生

select a.studentname from (
select studentname,coursename
from test_a where mark>60
) a
group by a.studentname
having count(a.coursename)>=2