sql - 如何在不写选择的情况下分组
问题描述
我试图在 oracle 中编写一个 sql 脚本,该脚本对来自不同列的数据进行分组。
让我们看看下面的例子:
class_name 年份 student_id 年级 考试 ID --------- ---- --------- ----- -------- 2012 年 3 90 1 2012 年 4 80 1 A 2012 5 70 1 2013 年 3 90 1 A 2013 4 100 2 2013 年 5 70 1 2014 年 3 90 1 2014 年 4 100 2 2014 年 5 75 3 2015 年 3 85 4 2015 年 4 95 4 2015 年 5 80 4 2016 年 3 85 4 2016 年 4 90 5 2016 年 5 90 5
上表显示了一个名为“A”的班级,该班级有 3 名学生以及每年特定考试的成绩。每年都有一次新的考试,如果学生决定参加考试,则表格将填满新的考试 ID,否则(即学生没有参加考试)表格将再次填满旧的考试-id(和旧等级)
现在,我想显示每年实际参加考试的学生人数。
所以结果应该是这样的:
class_name 年份 num_of_students_take_the_exam --------- ---- ----------------- 2012 年 3 2013 年 1 2014 年 1 2015 年 3 2016 年 2
我知道如何使用 select 和 group-by 以及 select 和 group-by 结果。但这似乎太复杂了。
选择类名、年份、计数(年份) 从 (选择 class_name, min(year) as year, student_id, Grade, min(exam-id) 从 我的表 在哪里 类名 = 'A' 通过...分组 class_name、student_id、等级) 通过...分组 类名,年份
有没有返回相同结果的简单 sql 脚本?
谢谢
解决方案
您当前的查询可以简化一点,但您不能删除嵌套聚合:
select class_name, year, count(*)
from
(select
class_name, min(year) as year, student_id, exam_id
from
my_table
Where
class_name = 'A'
group by
class_name, student_id, exam_id) -- don't group by grade, there might be two different exams with the same grade
group by
class_name, year
用 LAG(或 ROW_NUMBER)重写可能不是更简单/更有效
推荐阅读
- twig - 我想将 OR 运算符放在 twig if 语句中,但 OR 运算符在 Twig 中不起作用
- reactjs - 使用类组件反应本机堆栈导航
- docker - 是否有编写用于构建 docker 映像的 Makefile 的击球手练习?
- oracle - 如何通过 Oracle PL/SQL 加快发送电子邮件的速度?
- python - 是否可以在 KIVY 中使用滑块比较 2 张图像之前和之后
- html - Django - 注册表单未在数据库中保存数据
- azure - 有没有办法自动化 azure shell 脚本?
- rest - Revolut API 刷新令牌问题
- java - 将tomcat与系统的外部文件夹链接,但无法在tomcat目录中找到文件
- youtube-api - 上传到 YouTube API 时缺少“Access-Control-Allow-Origin”