SQL查找一致的失败

时间:2013-12-11 18:40:14

标签: sql postgresql aggregate-functions

我有一张学生证的科目和成绩表

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并猜测窗口或聚合函数会对此有所帮助吗?

1 个答案:

答案 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>