Здесь мы используем функцию ранжирования, чтобы найти избыточные данные, а затем case
может пустой его по мере необходимости. Обратите также внимание на то, что мы обрабатываем несколько «категорий» или «групп» или как вам будет разбиваться по вашим реальным данным (здесь показаны столбцы a
и b
здесь).
;with cte as (
select 'color' as a, 'red' as b, 'AA' as c
union all select 'color', 'red', 'BB'
union all select 'color', 'red', 'CC'
union all select 'color', 'blue', 'DD'
union all select 'color', 'blue', 'EE'
union all select 'smell', 'bad', 'AA'
union all select 'smell', 'bad', 'BB'
union all select 'smell', 'bad', 'CC'
union all select 'smell', 'good', 'DD'
union all select 'smell', 'good', 'EE'
)
select case when row_number() over (partition by a order by b, c) = 1 then a else '' end as ColA
, case when row_number() over (partition by a, b order by c) = 1 then b else '' end as ColB
, c as ColC
from cte
order by a, b, c
Это даст следующий результат:
ColA ColB ColC
----- ---- ----
color blue DD
EE
red AA
BB
CC
smell bad AA
BB
CC
good DD
EE