짝을 이루지 않는 데이타 삭제 msSQL 0 2 1,052

by 갈매기 [SQL Query] [2019.06.27 12:05:39]


안녕하세요. 쿼리를 짜다 막혀서 답을 구하고 있습니다. 

ID 별로 2개의 status가 존재 합니다. [30,40]. 하나의 짝으로 존재하는 30과 40은 rownumber로 표현됩니다. 가장 최근 date가 rownumber 1번으로 부여를 받고, 예전 데이타로 갈수록 숫자는 증가합니다. 

ID status rownumber date
a123 30 1 20190102
a123 40 1 20190103
b123 30 2 20190102
b123 40 2 20190103
b123 30 1 20190108
b123 40 1 20190109
c123 30 2 20190111
c123 30 1 20190112
c123 40 1 20190113
d123 30 1 20190114
d123 40 2 20190115
d123 40 1 20190116

상기와 같이 데이타 셑이 있는데, 실수로 30 이 두번 입력되거나 40이 두번 입력 된 경우가 있습니다. 이 짝이 없는 데이타를 뺀 하기와 같은 값을 얻기를 원합니다. 즉 짝이 없는 rownumber를 삭제해야 합니다. 

ID status rownumber date
a123 30 1 20190102
a123 40 1 20190103
b123 30 2 20190102
b123 40 2 20190103
b123 30 1 20190108
b123 40 1 20190109
c123 30 1 20190112
c123 40 1 20190113
d123 30 1 20190114
d123 40 1 20190116

고견 부탁 드립니다. 

MS SQL 입니다. 

by 르매 [2019.06.27 12:29:34]
CREATE TABLE table_name (
	  ID char(4)
    , status int
    , rownumber int
    , [date] date
);

INSERT table_name (ID, status, rownumber, [date])
VALUES ('a123', 30, 1, '20190102')
, ('a123', 40, 1, '20190103')
, ('b123', 30, 2, '20190102')
, ('b123', 40, 2, '20190103')
, ('b123', 30, 1, '20190108')
, ('b123', 40, 1, '20190109')
, ('c123', 30, 2, '20190111')
, ('c123', 30, 1, '20190112')
, ('c123', 40, 1, '20190113')
, ('d123', 30, 1, '20190114')
, ('d123', 40, 2, '20190115')
, ('d123', 40, 1, '20190116');

- 삭제 대상 레코드

SELECT ID, rownumber
FROM table_name
GROUP BY ID, rownumber
HAVING COUNT(*) = 1

- 삭제 하기

DELETE T
FROM (
    SELECT ID, rownumber
    FROM table_name
    GROUP BY ID, rownumber
    HAVING COUNT(*) = 1
) S INNER JOIN table_name T ON T.ID = S.ID AND T.rownumber = S.rownumber;

by 갈매기 [2019.06.27 23:34:59]

count(*)로 간단히 해결되는 군요. 고견 감사합니다. 

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