在 Postgres 中通过复杂分区获取重复值的连续计数
Get consecutive count on repeated values with complex partition by in Postgres
给定一组 3 列(蓝色列:学生、学期、年级),我需要使用 Postgres 中的查询来计算每个学生有多少个连续的学期有相同的成绩(绿色列)。
(第一个连续学期平均 8:consec = 1。第二个连续学期平均 8:consec = 2...)
样本数据fiddle:https://www.db-fiddle.com/f/v31a5Bpere26tXQb5L1fFJ/0
预期结果:
我试过使用
ROW_NUMBER() OVER(partition by student)
ROW_NUMBER() OVER(partition by avg_grade)
ROW_NUMBER() OVER(partition by student, avg_grade)
ROW_NUMBER() OVER(partition by student, semester)
但是上面的none得到了预期的结果。
非常感谢您的帮助!
这是一种间隙和孤岛问题。最简单的方法可能是使用每个年级和每个学期的序列之间的差异来定义组。然后在更多时间使用row_number()
:
select g.*,
row_number() over (partition by student, avg_grade, semester - seqnum order by semester) as consec_avg
from (select g.*,
row_number() over (partition by student, avg_grade order by semester) as seqnum
from grades
) g;
Here 是一个 db<>fiddle.
给定一组 3 列(蓝色列:学生、学期、年级),我需要使用 Postgres 中的查询来计算每个学生有多少个连续的学期有相同的成绩(绿色列)。
(第一个连续学期平均 8:consec = 1。第二个连续学期平均 8:consec = 2...)
样本数据fiddle:https://www.db-fiddle.com/f/v31a5Bpere26tXQb5L1fFJ/0
预期结果:
我试过使用
ROW_NUMBER() OVER(partition by student)
ROW_NUMBER() OVER(partition by avg_grade)
ROW_NUMBER() OVER(partition by student, avg_grade)
ROW_NUMBER() OVER(partition by student, semester)
但是上面的none得到了预期的结果。
非常感谢您的帮助!
这是一种间隙和孤岛问题。最简单的方法可能是使用每个年级和每个学期的序列之间的差异来定义组。然后在更多时间使用row_number()
:
select g.*,
row_number() over (partition by student, avg_grade, semester - seqnum order by semester) as consec_avg
from (select g.*,
row_number() over (partition by student, avg_grade order by semester) as seqnum
from grades
) g;
Here 是一个 db<>fiddle.