yoursyun

1개 남겨놓고 중복된 행삭제 방법 본문

database/mariaDB

1개 남겨놓고 중복된 행삭제 방법

yoursyun 2018. 1. 14. 16:34

1. 유일값 컬럼이 없는경우는 강제 생성해줘야한다. ( 남겨놓을 것의 기준점 생성 )


2. mssql, oracle 과 같이 row number 함수를 mysql 에서는 아래와 같이 구현

   - 방법은 그룹핑 값과 같은 것들에 대해 각 레코드(행) 마다 비교하여 넘버링 

   - 이를 통해 그룹의 시퀀스 번호를 작성

   - 최종적으로 1을 제외한 나머지 값들의 유일값을 가져오는 쿼리 이다.


select * from 테이블명 where 유일값 in ( 

  select 유일값 from 

  (

    select row_no, 유일값, 그룹핑값

    from (

            select 

            a.유일값, a.그룹핑값

            , (case @v_그룹핑값 when a.그룹핑값 then 

                                     @rownum := @rownum + 1 

                                else @rownum := 1 and @v_그룹핑값 := a.그룹핑값

               end) as row_no        

            from 테이블명 as a

                 join (select @v_그룹핑값:='', @rownum:=0) as b


            order by a.auth_num

    ) as c

  ) as d where d.row_no > 1

);


3. 추가 여러개 그룹핑시

row_number 에서 여러행을 그룹핑하여 처리할 때에는 아래와 같이 직관적으로 기술하여 쓴다.

* 변수 사용시 컬럼 순서에 연관이 있으므로 변수에 값을 할당할때 아래와 같이 조건뒤에 변수를 할당한다.


            select 

              a.유일값

              , a.그룹핑값1

              , a.그룹핑값2

              , (case when (@v_그룹핑값1 = a.그룹핑값1

                            and @v_그룹핑값2) = a.그룹핑값1) then 

                                       @rownum := @rownum + 1

                      else @rownum := 1

                 end) as row_no

              , @v_그룹핑값1 := a.그룹핑값1 as v_그룹핑값1별칭

              , @v_그룹핑값2 := a.그룹핑값2 as v_그룹핑값2별칭

            from neos.t_ex_card_aq_tmp as a

                 join (select @v_그룹핑값1:='', @v_그룹핑값2:=0, @rownum:=0) as b

            order by a.그룹핑값1

반응형