SQLlite使用嵌套查询获取最小值、最大值和平均值
我有这些桌子SQLlite使用嵌套查询获取最小值、最大值和平均值,sql,sqlite,Sql,Sqlite,我有这些桌子 record: sid (string), cid (string), quarter (string), year (integer), grade(integer) student: sid (string) 对于每一个至少上过一堂课的学生,也就是说一个学生至少被输入记录表一次,我需要得到他们最近一个季度的GPA。我需要显示sid、季度、年度和年级gpa 在给定的日历年中有3个季度,观察季度的出现顺序可能会有所帮助,其字母顺序为“W”>“S”>“F”。这些分别代表冬天、春天、
record: sid (string), cid (string), quarter (string), year (integer), grade(integer)
student: sid (string)
对于每一个至少上过一堂课的学生,也就是说一个学生至少被输入记录表一次,我需要得到他们最近一个季度的GPA。我需要显示sid、季度、年度和年级gpa
在给定的日历年中有3个季度,观察季度的出现顺序可能会有所帮助,其字母顺序为“W”>“S”>“F”。这些分别代表冬天、春天、秋天。秋天是今年的最后一个季度
这就是我想到的:
select sid, quarter, year, avg(grade) as gpa
from (select sid, min(quarter) as quarter, year, avg(grade) as grade
from (select *, max(year) as maxy
from record
group by sid)
group by sid)
group by sid;
这给了我所有注册季度/年份的平均分数,也没有给我最近一个季度的分数
我只能使用不存在/存在、不在/在、分组依据、订单依据等功能。我不能用rank
我被告知,我应该使用NOT EXIST获取最近一个季度,因为最近一个季度意味着某个特定季度没有后续季度
任何帮助都将不胜感激。谢谢大家! 要使用不存在的解决方案吗?给你
Select t.*
From record t
Where not exists
(Select 1 from record tt
Where tt.year > t.year
And tt.quarter < t.quarter
And tt.sid = t.sid)
以上查询将提供学生最近一季度的所有数据,然后您可以根据需要使用聚合功能。使用行号:
虽然这可以通过依赖季度的字母顺序来简化一点,但我不推荐这种方法。对时间段依赖字母顺序是违反直觉的,这会使代码更难理解
如果季度被存储为一个数字,那么它将适合按order by使用。这看起来与最近提出的问题非常相似。这是家庭作业问题吗?
select r.*
from (select r.*,
row_number() over (partition by sid
order by case quarter when 'W' then 1 when 'S' then 2 when 'F' then 3 else 4 end desc
) as seqnum
from records r
) r
where seqnum = 1;