첨부한 사진처럼 원본 원하는결과가 전부이고 부연설명이 필요 없을듯 해요
임시테이블 작성 쿼리입니다.
with tb1(이름, cnt)
as
(
select '서', '1' union all
select '서', '2' union all
select '서', '7' union all
select '서', '9' union all
select '서', '4' union all
select '부', '1' union all
select '바', '9' union all
select '바', '1' union all
select '토', '5' union all
select '토', '7' union all
select '최','1' union all
select '대','1' union all
select '대','8' union all
select '대','4' union all
select '대','26' union all
select '신', '1'
)
select
*
from tb1
with tb1(name, cnt) as ( select '서', 1 union all select '서', 2 union all select '서', 7 union all select '서', 9 union all select '서', 4 union all select '부', 1 union all select '바', 9 union all select '바', 1 union all select '토', 5 union all select '토', 7 union all select '최', 1 union all select '대', 1 union all select '대', 8 union all select '대', 4 union all select '대', 26 union all select '신', 1 ) , tb2 as ( select name, cnt ,row_number() over(partition by name order by cnt) as n_cnt_1 ,row_number() over(partition by name order by cnt desc) as n_cnt_2 from tb1 ) select name, cnt from tb2 where n_cnt_2 > 1 or n_cnt_1 = 1 order by name, cnt
1. 이름 -> name 으로 컬럼명칭 변경
2. cnt 의 데이터 타입 : 문자 -> 숫자
라고 임의 변경한 쿼리 입니다.
일단 name 별 cnt 순서별 넘버링, cnt 역순별 넘버링 한 컬럼을 만듭니다.
해당 조건으로 역순별 넘버링 컬럼의 1을 제외 합니다(제일 큰 숫자)
name 별 row 값이 1개라면 삭제 대상에서 제외 되므로 순서별 넘버링 값이 1인 값을 포함 시킵니다
(순서별 넘버링 값이 1 이면서 역순별 넘버링 값이 1이면 해당 name의 row 가 1개 이므로 or 절에 포함)
이런 순서의 로직을 작성했습니다.
급하게 만들어 깊게 생각하지는 못했는데 조금 확인하다 보면 더 효율적인 방법이 있을듯도 합니다.