본문 바로가기

it-day/postgreSQL

ROW_NUMBER() OVER PARTITION BY

상황

 - 중복이 있는 데이터에서 순위를 매겨서 그것만 쓰려고한다.

ask_dt (varchar) 요청일자
corp_nm(varchar) 회사이름
biz_no (varchar) 사업자번호

select a.ask_dt
     , a.corp_nm
     , a.biz_no  
  from corp_tb a 
 where TO_CHAR(TO_DATE(a.ask_dt, 'YYYYMMDD'),'YYYYMM') = TO_CHAR(now(),'YYYYMM')

 

결과가 아래와 같이 출력이 됩니다
20240401 a회사 11111111111
20240402 a회사 11111111111
20240415 b회사 2222222222
20240415 a회사 11111111111
20240416 a회사 11111111111
20240417 c회사 3333333333
20240417 a회사 11111111111
20240418 c회사 3333333333
20240419 c회사 3333333333
20240422 c회사 3333333333
20240423 a회사 11111111111
20240424 c회사 3333333333
20240426 a회사 11111111111

 

(빨간 글씨만 가져오고 싶다..)

 

결과를 보면

b회사 제외 a,c회사가 중복이 되는 것이 있다.

group by와 중복을 제거해서 select절의 distinct 조건을 사용하는 방법이 있지만

중복 제거한 컬럼 이외의 데이터는 볼 수가 없다는 것

 

ROW_NUMBER() 함수 사용 시

 

SELECT a.*
FROM (
        SELECT xa.*
             , ROW_NUMBER() OVER (PARTITION BY xa.corp_nm, xa.biz_no ORDER BY TO_DATE(xa.ask_dt, 'YYYYMMDD') ASC) AS row_num
          FROM pro_quote_info xa
         WHERE TO_CHAR(TO_DATE(xa.ask_dt, 'YYYYMMDD'),'YYYYMM') = TO_CHAR(now(),'YYYYMM')
     ) a
WHERE a.row_num = 1

 

20240401 a회사 11111111111

20240415 b회사 2222222222
20240417 c회사 3333333333