Просто стало интересно. Решение для Oracle.
create table sla_cat(id number, name varchar2(64))
create table sla_art(id number, cat_id number, name varchar2(64))
insert into sla_cat values(1,'first')
insert into sla_cat values(2,'second')
insert into sla_cat values(3,'third')
insert into sla_art values(1,1,'article1_from_cat1')
insert into sla_art values(2,1,'article2_from_cat1')
insert into sla_art values(3,1,'article3_from_cat1')
insert into sla_art values(4,1,'article4_from_cat1')
insert into sla_art values(5,1,'article5_from_cat1')
insert into sla_art values(6,1,'article6_from_cat1')
insert into sla_art values(7,1,'article7_from_cat1')
insert into sla_art values(8,1,'article8_from_cat1')
insert into sla_art values(9,1,'article9_from_cat1')
insert into sla_art values(10,1,'article10_from_cat1')
insert into sla_art values(11,2,'article1_from_cat2')
insert into sla_art values(12,2,'article2_from_cat2')
insert into sla_art values(13,2,'article3_from_cat2')
insert into sla_art values(14,2,'article4_from_cat2')
insert into sla_art values(15,3,'article1_from_cat3')
insert into sla_art values(16,3,'article2_from_cat3')
select * from SLA_ART a
where a.ID in (
select
max(a.ID) keep (dense_rank last order by a.ID) over(partition by a.CAT_ID)rn from SLA_ART a
)
union
select * from SLA_ART a
where a.ID in (
select
max(a.ID-1) keep (dense_rank last order by a.ID) over(partition by a.CAT_ID)rn from SLA_ART a
)
max(a.ID-1) - цифрой управляем насколько старые статьи мы хотим увидеть.