쿼리 가장 마지막 등록번호의 특정값 찾기 질문드립니다. 0 3 2,014

by 피리부 [SQL Query] SQL ORACLE QUERY [2022.08.29 10:48:26]


 

계약NO 계약SERIAL 차량번호 이름 가입NO 가입SERIAL 계약시작일 계약종료일 임급회차 분할회차 상태값    
20220100051 001 000가0000 홍길동 01000101 000 20220101 20230101 1 4 4    
20220100051 000 000가0000 홍기동 01000101 000 20220101 20230101 1 4 3    

 

이런식으로 계약NO에 변경사항이 발생하면 계약기간은 유지하고 계약 SERIAL 이 000에서 1씩 올라갑니다. (기존데이터도 필요하기에)

표에 있는 데이터들 불러오고 싶은데 조회는 계약번호 || 계약SERIAL  / 차량번호 / 가입NO || 가입SERIAL 로 조회하고있습니다.

 계약번호는 1년단위로 재계약을 통해서 새로 부여하는 방식으로 계약번호가 해당 차량번호나 가입번호에 매치되어 쌓입니다. 

 그래서 지금 찾고 싶은 조건은 이런 조건으로 불러왔을때 즉 차량번호 / 가입번호 / 계약번호 등으로 조회시 불러오는 데이터 중 가장 위에 생성되는 (계약번호+SERIAL이가 가장최신) 것 중 상태값이 4 인것들을 찾으려고 합니다.

 

 

SELECT  계약NO, 계약SERIAL....... 	from TABLE where (차량번호, 계약NO) in ( 	select 차량번호, max(계약NO) as 계약NO 	from TEST group by 차량번호 ) AND 상태값 = '4' order by 차량번호;

 

이런식으로 풀어가려했는데, 원하는 데이터 방향이 아니더군요,

 

SELECT MAX(계약NO),....... FROM TABLE

WHERE 상태값 = '4' ;

 

이부분도 맨처음 했지만 당연히 순서가 WHERE 이 먼저라 상태값 4인것들중 계약번호가 최신값이 나와서 

 초기 접근은 계약번호가 MAX 값 인것들중 상태값이 4 인것들을 찾으려했는데 너무 많이나와서 계약일자로 줄여보고 해도 원하는 데이터가 안나오더라구요 ㅠㅠ 제가 어디서 접근 법이 잘못되었는지 옳바른 접근법은 뭘까요 이것저것 찾아보며 주말내내 해보아도 진행이 안되어 질문드립니다.

by 창조의날개 [2022.08.29 11:04:44]
SELECT *
FROM (SELECT A.*
           , ROW_NUMBER() OVER (PARTITION BY 계약NO ORDER BY 계약SERIAL DESC) RN
        FROM 테이블명 A
     )
WHERE RN = 1
  AND 상태값 = '4'
;

 


by 마농 [2022.08.29 11:27:22]

- 오류 : WHERE (차량번호, 계약NO) IN (SELECT 차량번호, MAX(계약NO) FROM test GROUP BY 차량번호)
- 수정 : WHERE (계약NO, 계약SERIAL) IN (SELECT 계약NO, MAX(계약SERIAL) FROM test GROUP BY 계약NO)


by 마농 [2022.08.29 13:32:19]

구하고자 하는 것이 명확해야 합니다.
- 계약번호별 최신자료인지?
- 차량번호별 최신자료인지?
 

-- 차량번호 기준으로 최신 계약번호 자료를 조회하려면.
SELECT *
  FROM (SELECT 차량번호
             , 계약NO
             , 계약SERIAL
             , .......
             , ROW_NUMBER() OVER(PARTITION BY 차량번호 ORDER BY 계약NO DESC, 계약SERIAL DESC) rn
          FROM table
        )
 WHERE rn = 1
   AND 상태값 = '4'
;

 

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