SQL窗口函数
Posted EbowTang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL窗口函数相关的知识,希望对你有一定的参考价值。
一张图小结窗口函数:
来自牛客网的原理解释
窗口函数
row_number() over partition by
函数的含义为先分组再排序, row_number() over (partition by col1 order by col2),
表示根据col1分组,在分组内部根据col2排序,为了更好的理解,我们来看个例 子
代码:
Select device_id, university,gpa,
row_number() over (partition by university order by gpa desc) as
rank. - -desc代表降序排列
From user_profile
上述代码含义为在每个学校的内部根据gpa进行一次排名,获得每个学生在学校的名次数据,desc代表是按照从大到小降序排列。
示例:
SQL33 找出每个学校GPA最低的同学
题目:现在运营想要找到每个学校gpa最低的同学来做调研,请你取出每个学校的最低gpa。
示例:user_profile
id | device_id | gender | age | university | gpa | active_days_within_30 | question_cnt | answer_cnt |
1 | 2138 | male | 21 | 北京大学 | 3.4 | 7 | 2 | 12 |
2 | 3214 | male | 复旦大学 | 4 | 15 | 5 | 25 | |
3 | 6543 | female | 20 | 北京大学 | 3.2 | 12 | 3 | 30 |
4 | 2315 | female | 23 | 浙江大学 | 3.6 | 5 | 1 | 2 |
5 | 5432 | male | 25 | 山东大学 | 3.8 | 20 | 15 | 70 |
6 | 2131 | male | 28 | 山东大学 | 3.3 | 15 | 7 | 13 |
7 | 4321 | female | 26 | 复旦大学 | 3.6 | 9 | 6 | 52 |
根据示例,你的查询结果应参考以下格式,输出结果按university升序排序:
device_id | university | gpa |
6543 | 北京大学 | 3.2000 |
4321 | 复旦大学 | 3.6000 |
2131 | 山东大学 | 3.3000 |
2315 | 浙江大学 | 3.6000 |
select device_id,university,min(gpa)
from user_profile
group by university;
报错:
SQL_ERROR_INFO: "Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'user_profile.device_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by"
可行的正确答案:从排好的表中获取结果
select device_id,university,gpa
from (
select device_id,university,gpa,
row_number() over (
partition by university
order by gpa
) as rk
from user_profile
) as tab
where rk = 1
以上是关于SQL窗口函数的主要内容,如果未能解决你的问题,请参考以下文章