Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLlite使用嵌套查询获取最小值、最大值和平均值_Sql_Sqlite - Fatal编程技术网

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;