SQL 그룹내에서 가장 큰 데이터 및 가장 작은데이터 가져오기

hyeoncheol Lee·2023년 1월 12일

SQL

목록 보기
10/10

참고할 쿼리

SELECT * 
		FROM (
	        SELECT  '0' AS CHK /*선택*/ 
	                ,A.RLT_CMP_CD   		/*관계회사코드*/
	                ,A.ISN_NO       		/*발급번호*/
	                ,A.ISN_TP_CD		/*발급유형코드*/
	                ,A.SN           		/*순번*/
	                ,A.ISN_DOC_NM   		/*발급서류명*/
	                ,A.ISN_DATE     		/*발급일시*/
	                ,CONVERT(CHAR(8), A.ISN_DATE, 112)	AS ISN_YMD        /*발급일시:발급일자*/
	                ,A.ISN_DTT_CD   		/*발급구분코드*/
	                ,A.ISN_INCD     		/*발급부수*/
	                ,A.ISN_OPT_CONT   		/*발급옵션내용*/
	                ,A.ISN_EMP_NO   		/*발급사원번호*/
	                ,Y.EMP_NM				/*사원명*/
	                ,IIF((COUNT(*) OVER(PARTITION BY A.RLT_CMP_CD, A.ISN_NO, A.ISN_TP_CD)) > 1, '재발행', '정상발행') AS USE_STS_NM	/*사용상태*/
	                ,IIF((COUNT(*) OVER(PARTITION BY A.RLT_CMP_CD, A.ISN_NO, A.ISN_TP_CD)) > 1, CONVERT(CHAR(8), (MAX(ISN_DATE) OVER(PARTITION BY A.RLT_CMP_CD, A.ISN_NO, A.ISN_TP_CD)), 112), '') AS RE_PBLC_YMD	/*재발급일자*/
	                ,IIF((COUNT(*) OVER(PARTITION BY A.RLT_CMP_CD, A.ISN_NO, A.ISN_TP_CD)) > 1, (COUNT(*) OVER(PARTITION BY A.RLT_CMP_CD, A.ISN_NO, A.ISN_TP_CD))-1, '') AS RE_PBLC_CNT	/*재발행횟수*/
	                ,B.PAMT_TO        			/*납입회차:분납회차*/
	                ,CONVERT(CHAR(8), B.RCP_DATE, 112)	AS RCP_YMD        /*영수일시:영수일자*/
	                ,B.WTSL_TR_AMT        			/*원화환산금액:영수공제료*/
	                ,B.FSC_YMD        			/*회계일자*/
	                ,(SELECT RLTPSN_NM FROM TB_GC_INSCT_RLTPSN_D WHERE RLT_CMP_CD = C.RLT_CMP_CD AND INSPLY_NO = C.INSPLY_NO AND EDR_NO = C.EDR_NO AND RLTPSN_DTT_CD = '01') AS INSR_AGPR	/*계약자*/
	                ,C.INSPLY_NO        		/*공제증권번호*/
	                ,C.EDR_NO        			/*배서번호*/
					,C.INSR_PRD_CD              /*공제상품코드*/
					,ROW_NUMBER() OVER(PARTITION BY A.RLT_CMP_CD, A.ISN_NO, A.ISN_TP_CD ORDER BY A.ISN_DATE DESC) AS ROWNUM
	        FROM    TB_GC_INSR_RND_M B /*[공제입출금]*/
	        
					INNER JOIN TB_GC_INSR_ISN_HIS_M A              /* [공제발급이력] */
	                ON  A.ISN_NO = B.RCWR_NO /*영수증번호:인덱스 생성한다고함*/	
	                
	                INNER JOIN TB_GC_INSCT_M C	/*[공제계약]*/
	                ON	C.RLT_CMP_CD = B.RLT_CMP_CD	/*관계회사코드*/
	                AND C.INSPLY_NO = B.INSPLY_NO	/*공제증권번호*/
	                AND C.EDR_NO = B.EDR_NO	/*배서번호*/
	                
	               	LEFT OUTER JOIN TB_HR_HNR_BSC_M Y /*[인사기본]*/
	                ON  Y.RLT_CMP_CD = A.RLT_CMP_CD /*관계회사코드*/
	                AND Y.EMP_NO = A.ISN_EMP_NO /*사원번호*/     	                
	        WHERE	1 = 1
			AND 	A.RLT_CMP_CD = '1000'
			AND 	A.ISN_TP_CD = '03'	/*발급유형코드:영수증*/
		) A
	WHERE 	1 = 1
	AND 	A.ROWNUM = 1

=> 먼저 기본조회 쿼리에서 PARTITION BY 로 그룹을 주고 여기에 ORDER BY로 순서를 줄 컬럼을 정한다. 가장 큰값을 구하려면 DESC 를 붙히고 가장 작은 값을 구하려면 ASC를 구한다.

,ROW_NUMBER() OVER(PARTITION BY A.RLT_CMP_CD, A.ISN_NO, A.ISN_TP_CD ORDER BY A.ISN_DATE DESC) AS ROWNUM

이렇게 되면 ROWNUM 이 ISN_DATE 기준으로 가장 큰값에 1번에 붙게 된다.
그러면 해당 쿼리를 감싸주고 밖에 있는 쿼리에서 ROWNUM = 1을 붙여서 가장 큰값만 가져오게 하면 된다.

profile
개발블로그

0개의 댓글