Если вы хотите одну запись в месяц с предпочтением «фактическая», тогда используйте row_number()
:
select t.*
from (select t.*,
row_number() over (partition by id, year(changedOn), month(changedOn) order by recordtype) as seqnum
from t
) t
where seqnum = 1;
Если вы хотите, чтобы все «фактические» записи за месяц - и затем, если есть нет - все записи истории, я бы порекомендовал logi c вот так:
select t.*
from t
where t.recordtype = 'actual' or
(t.recordtype = 'history' and
not exists (select 1
from t t2
where t2.id = t.id and
t2.recordtype = 'actual' and
year(t2.changedon) = year(t.changedon) and
month(t2.changedon) = month(t.changedon)
);
Эти два подхода слегка различаются. Но вы заметите различия только в том случае, если у вас есть несколько «фактических» или «исторических» за один месяц для одного идентификатора.