gpt4 book ai didi

sql - 如何分组而不在选择中写入选择

转载 作者:行者123 更新时间:2023-12-01 01:44:31 25 4
gpt4 key购买 nike

我试图在 oracle 中编写一个 sql 脚本,它对来自不同列的数据进行分组。

让我们看看下面的例子:

class_name 年份 student_id 年级考试 ID
--------- ---- --------- ----- -------
A 2012 3 90 1
A 2012 4 80 1
2012 年 5 70 1
A 2013 3 90 1
A 2013 4 100 2
2013 年 5 70 1
2014 年 3 90 1
A 2014 4 100 2
A 2014 5 75 3
2015 年 3 85 4
A 2015 4 95 4
2015 年 5 80 4
2016 年 3 85 4
2016 年 4 90 5
A 2016 5 90 5

上表显示了一个名为“A”的类(class),该类(class)有 3 名学生以及每年特定考试的成绩。每年都有一次新的考试,如果学生决定参加考试,表格会填上新的考试编号,否则(即学生没有参加考试)表格会重新填上旧考试-id(和旧成绩)

现在,我想显示每年实际参加考试的学生人数。

所以结果应该是这样的:

class_name 年份 num_of_students_took_the_exam
--------- ---- -----------------------------
一个 2012 3
A 2013 1
2014 年 1
A 2015 3
A 2016 2

我知道如何使用 select 和 group-by 以及 select 和 group-by 结果来做到这一点。但是好像太复杂了。

选择 class_name, year, count(year)

(选择
class_name, min(year) as year, student_id, grade, min(exam-id)

我的表
在哪里
class_name = 'A'
通过...分组
class_name、student_id、成绩)
通过...分组
类(class)名称,年份

是否有任何简单的 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)重写可能并不更简单/更有效

关于sql - 如何分组而不在选择中写入选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52513368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com