mssql 질문 0 7 1,064

by 미무미 [SQLServer] mssql sqlserver [2022.04.27 14:41:25]


구루비 질문.png (6,698Bytes)

첨부한 사진처럼 원본 원하는결과가 전부이고 부연설명이 필요 없을듯 해요

 

임시테이블 작성 쿼리입니다.

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 

by 우주민 [2022.04.27 14:47:16]

1. 이름별 row 수가 2개 이상인 항목 중에서 최대값을 제외하는 문제 인가요?

2. cnt 를 문자로 처리한 이유가 있을까요?


by 미무미 [2022.04.27 14:49:27]

1. 네 맞습니다.

2. cnt가 문자인 것은 아무 의미가 없습니다 숫자여도 되고 상관이없습니다. 결론은 이유가 없어요


by 우주민 [2022.04.27 14:54:20]

추가로 혹시 출력의 순서가 중요한가요?

아니면 저 내용만 있다면 순서는 상관이 없나요?


by 미무미 [2022.04.27 14:57:22]

순서도 상관이없습니다


by 마농 [2022.04.27 14:59:59]

1. 설명이 필요합니다. 우주민님 통찰력이 좋으신 듯.
2. 숫자여야 합니다. 따옴표 제거 필요.


by 우주민 [2022.04.27 15:15:51]

마농님 감사합니다.

나름 뿌듯한 기분이네요.


by 우주민 [2022.04.27 15:00:25]
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 절에 포함)

 

이런 순서의 로직을 작성했습니다.

급하게 만들어 깊게 생각하지는 못했는데 조금 확인하다 보면 더 효율적인 방법이 있을듯도 합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입