Здравствуйте, кажется, что это делает то, что вы хотите
Данные (DDL)
create table example(
col1 varchar(100),
col2 varchar(100),
col3 varchar(100),
col4 varchar(100)
);
insert into example(col1,col2,col3,col4) values('Cat1','Cat1 Data', 'Subcat 1.1', 'Etc');
insert into example(col1,col2,col3,col4) values('Cat1','Cat1 Data', 'Subcat 1.2', 'Etc');
insert into example(col1,col2,col3,col4) values('Cat1','Cat1 Data', 'Subcat 1.3', 'Etc');
insert into example(col1,col2,col3,col4) values('Cat2','Cat2 Data', 'Subcat 2.3', 'Etc');
insert into example(col1,col2,col3,col4) values('Cat2','Cat2 Data', 'Subcat 2.3', 'Etc');
insert into example(col1,col2,col3,col4) values('Cat2','Cat2 Data', 'Subcat 2.3', 'Etc');
SQL-запрос (ответ)
select
CASE WHEN lag(col1) over (partition by null order by col1) = col1 THEN null ELSE col1 END col1,
CASE WHEN lag(col2) over (partition by null order by col2) = col2 THEN null ELSE col2 END col2,
col3, col4
From example