Работает как в Oracle, так и в SQL Server, я полагаю, что все это стандартный SQL, от более поздних стандартов:
with T_with_RN as
(select Department
, Category
, row_number() over (partition by Department order by count(*) Desc) as RN
from T
group by Department, Category)
select Department, Category
from T_with_RN
where RN = 1
РЕДАКТИРОВАТЬ Я не знаю, почему я использовал WITH, решение, вероятно, легче читать с помощью встроенного представления:
select Department, Category
from (select Department
, Category
, row_number() over (partition by Department order by count(*) Desc) as RN
from T
group by Department, Category) T_with_RN
where RN = 1
КОНЕЦ РЕДАКТИРОВАНИЯ
Контрольные примеры:
create table T (
Department varchar(10) null,
Category varchar(10) null
);
-- Original test case
insert into T values ('0001', 'A');
insert into T values ('0002', 'D');
insert into T values ('0003', 'A');
insert into T values ('0003', 'A');
insert into T values ('0003', 'C');
insert into T values ('0004', 'B');
-- Null Test cases:
insert into T values (null, 'A');
insert into T values (null, 'B');
insert into T values (null, 'B');
insert into T values ('0005', null);
insert into T values ('0005', null);
insert into T values ('0005', 'X');
-- Tie Test case
insert into T values ('0006', 'O');
insert into T values ('0006', 'P');