我有一张学生证的科目和成绩表
ID SUBJECT GRADE DATE
01 math A 23/1/2013
02 eng C 22/2/2013
02 math D 24/3/2012
03 social B- 1/3/2012
03 math E 14/5/2014
......
对于大多数受试者,失败等级为C,D或E
对于数学,失败等级是B-,C,D或E
我想找到在15个成绩的周期内连续5次失败成绩的学生。我希望在5次发生后立即收到通知。例如,
A A A B C C C C C A A A A B A
或
D E E E B- (maths)
11次过后,我不感兴趣
D D D D A A A A A A A B B B B
我正在使用postgresql并猜测窗口或聚合函数会对此有所帮助吗?
答案 0 :(得分:1)
您可能想采用为成绩分配整数的方法,例如0表示失败,1表示通过(当然取决于主题,并且最好从将成绩和科目与通过相关联的表中查找并失败)。
然后问题变为“在一系列5个整数中,总和等于0?”。
类似的东西:
Sum(pass_fail_integer) over (partition by student
order by date
rows between 4 preceding and current row)
如果序列5失败定义了您想要警告的条件,我不清楚15级循环的重要性。可能你会寻找一系列15个整数,总和小于11?
编辑:如果您想将搜索限制在最近的15个等级中,那么按日期降序为每个学生的成绩分配row_number的子查询允许您过滤最近的15个,其中您然后将应用上述逻辑来确定是否有五个连续失败。
所以查询的一般结构是:
select
distinct student
from (
select ...
sum(pass_fail_integer) over
(partition by student
order by date
rows between 4 preceding and
current row) consecutive_failures
from (
select ...
row_number() over (partition by student
order by date desc) rn
from ...)
where rn <= 15)
where consecutive_failures = 5)
您可以利用该内部查询来评估15级窗口中是否发生了5次失败,因此您可以提前消除任何不需要检查5 连续失败的学生。 / p>