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

iddevice_idgenderageuniversitygpaactive_days_within_30question_cntanswer_cnt
12138male21北京大学3.47212
23214male复旦大学415525
36543female20北京大学3.212330
42315female23浙江大学3.6512
55432male25山东大学3.8201570
62131male28山东大学3.315713
74321female26复旦大学3.69652

根据示例,你的查询结果应参考以下格式,输出结果按university升序排序:

device_iduniversitygpa
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窗口函数的主要内容,如果未能解决你的问题,请参考以下文章

SQL语言中的升序,降序,是怎么会事

SQL Server 索引 - 升序或降序,有啥区别?

PANDAS 中类似 SQL 的窗口函数:Python Pandas Dataframe 中的行编号

SQL-ORDER BY 多字段排序(升序降序)

在SQL中以破坏序列升序/降序对结果最小值/最大值进行分组

java中,如何实现集合的升序和降序排列