ここでは、ランキング関数を使用して冗長データを見つけ、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