oracle 子查询、Group by和窗口函数

该篇文章介绍了如何使用SQL子查询和窗口函数row_number()在学生学科成绩表中找出每个学生各学科的最高分,通过partitionbyid和name进行分区,并按成绩降序排序获取最高分记录。
  • 子查询:一个查询(外部查询)内部嵌套另一个查询(内部查询)。
  • Group by和窗口函数的区别:
    • GROUP BY

      • 用于将结果集中的数据分组,并对每个组进行汇总计算。
      • 汇总计算包括聚合函数(如 SUM()AVG()COUNT()MAX()MIN())的应用。
      • 结果集中每个分组只会保留一行,汇总计算的结果将代替原始行(原始数据会丢失)。
    • 窗口函数

      • 在保留结果集的原始行的情况下,对每一行进行计算。
      • 能够对数据进行排名、移动平均等复杂的分析。
      • 计算时会考虑窗口范围内的其他行,但不会改变结果集的行数(原始数据不会丢失)。
  • 各自的用途:
    • GROUP BY:适用于需要进行数据汇总和分组的场景,如计算总和、平均值、计数等。

    • 窗口函数:适用于需要在原始数据基础上进行复杂分析的场景,如排名、移动平均、逐行比较等。

  • 示例1:给定一张学生学科成绩表base_student_grade,字段id表示学生学号,name为姓名,subject表示学科,grade为某学科成绩。使用子查询和窗口函数查询每个学生成绩最高的学科和分数。
select id,name,subject,grade
from (
    select id,name,subject,grade,
        row_number() over(partition by id,name order by grade desc) as rn
    from base_student_grade
) where rn=1
  1. row_number() :窗口函数。为结果集中的每一行生成一个唯一的行号。
  2. partition by:将数据按照id,name进行分区,即将具有相同id,name的行分为同一个分区。
  3. order by grade desc:每个分区按照grade降序排列。
  4. rn=1:选取每个分区内的第一行,rn=2:选取每个分区内的第二行,rn<=2:选取每个分区内的前两行。
  • 示例2:将每个部门的员工薪资总和计算出来,并按部门分组。
​SELECT department_id, SUM(salary) AS total_salary
FROM employees
GROUP BY department_id;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值