У меня есть ученики, которые не учатся или поступают в другую школу, но зачислены в один или несколько классов или в наши классы по одному или нескольким предметам. Представление v_Enrollments возвращает полный список учащихся (NetId) и предмет (Subj) класса, который они посещают.
По причинам бухгалтерского учета мне нужно назначить каждого учащегося в одну и только одну кафедру (в зависимости от предмета). Если они посещают несколько классов по разным предметам, приоритет зависит от количества предметов. Если они берут одинаковое количество классов по разным предметам, то связь нарушается (псевдо) случайным образом.
Я не владею оконными функциями и немного изо всех сил пытаюсь найти решение. Приведенный ниже запрос работает, но я не могу не задаться вопросом, есть ли лучшее решение.
select NetId, Subj
from (
select NetId, Subj, RowNum
, Max(RowNum) Over (partition by NetId) as MaxRowNum
from (
select NetId, Subj
, Count(*) as Cnt
, MAX(Count(*)) Over(partition by NetId) as MaxCnt
, ROW_NUMBER() Over (partition by NetId order by checksum(NetId, Subj)) as RowNum
-- psuedorandom but repeatable ordering
from v_Enrollment
group by NetId, Subj
) as s2
where Cnt = MaxCnt
) as s1
where RowNum = MaxRowNum
order by NetId