我认为你应该放弃你的柱状格式和你的案例。您实际上需要一个直方图。最好采用“长”格式;如果需要,应用层可以重新格式化。
create table major_exams(
student_id int not null,
current_major text not null,
year smallint not null check (year between 1900 and 2200),
exam_result boolean not null
);
insert into major_exams(student_id, current_major, year, exam_result) values
( 1, 'Science', 2010, false),
( 1, 'Arts', 2013, true),
( 1, 'Arts', 2013, false),
( 2, 'Science', 2010, true),
( 2, 'Arts', 2011, true),
( 2, 'Science', 2013, true),
( 3, 'Arts', 2010, true),
( 3, 'Arts', 2015, true),
( 4, 'Arts', 2010, false),
( 4, 'Science', 2013, true),
( 5, 'Arts', 2010, false),
( 5, 'Arts', 2011, false),
( 5, 'Science', 2012, true);
select major, duration, count(*) as n
from (
select first_majors.major,
last_majors.year - first_majors.year + 1 as duration
from (
select distinct on (student_id) student_id, current_major as major, year
from major_exams
order by student_id, year
) first_majors
join (
select student_id, max(year) as year
from major_exams
group by student_id
) last_majors on last_majors.student_id = first_majors.student_id
) major_bounds
group by major, duration
order by major, duration;
major duration n
Arts 3 1
Arts 4 1
Arts 6 1
Science 4 2