Notice
Recent Posts
Recent Comments
관리 메뉴

안까먹을라고 쓰는 블로그

[MSSQL] 순번 매기기(Feat. 그룹 별 최상위 데이터 가져오기) 본문

DataBase/MS SQL

[MSSQL] 순번 매기기(Feat. 그룹 별 최상위 데이터 가져오기)

YawnsDuzin 2022. 5. 20. 16:59

 

반응형

순위함수 와 OVER절을 사용하여, 데이터의 순번을 매길 수 있습니다.
아래는 순위함수 별 순번을 매기는 방법 및 결과에 대해서 설명합니다.


원본 데이터
SELECT * FROM [NEOE].[ORDER] ORDER BY CD_ITEM, DT_ORDER, QT_ORDER


QT_ORDER 큰 순서로 전체 넘버 매기기
SELECT 
    DT_ORDER,
    CD_ITEM,
    QT_ORDER,
    ROW_NUMBER() OVER (ORDER BY QT_ORDER DESC) AS RankNo
FROM [NEOE].[ORDER]

 

QT_ORDER 큰 순서로 전체 넘버 매기기
. RANK()는 중복값이 있으면 동일한 순번으로 표시 되며, 다음순번에 그만큼 +가 된 값이 표시됨.
SELECT 
    DT_ORDER,
    CD_ITEM,
    QT_ORDER,
    RANK() OVER (ORDER BY QT_ORDER DESC) AS RankNo
FROM [NEOE].[ORDER]

 

QT_ORDER 큰 순서로 전체 넘버 매기기
. DENSE_RANK()는 RANK()와 같이 중복값이 있으면 동일한 순번으로 조회 되며,
  RANK()와는 다르게 다음 순번은 그 이후의 순번이 순차적으로 표시 됨.
SELECT 
    DT_ORDER,
    CD_ITEM,
    QT_ORDER,
    DENSE_RANK() OVER (ORDER BY QT_ORDER DESC) AS RankNo
FROM [NEOE].[ORDER]

 

QT_ORDER 큰 순서로 그룹으로 나눠서 순번 정하기
. NTILE(n) 은 n개의 그룹으로 나눠서 순번을 정해서 조회 됨.
SELECT 
    DT_ORDER,
    CD_ITEM,
    QT_ORDER,
    NTILE(3) OVER (ORDER BY QT_ORDER DESC) AS RankNo
FROM [NEOE].[ORDER]

 


각 품목(CD_ITEM) 별, QT_ORDER가 가장 큰것 1개씩 조회
SELECT * FROM (
	SELECT 
		DT_ORDER,
		CD_ITEM,
		QT_ORDER,
		ROW_NUMBER() OVER (PARTITION BY CD_ITEM ORDER BY QT_ORDER DESC) AS RankNo
	FROM [NEOE].[ORDER]
	) T
WHERE RankNo = 1


T 의 조회 데이터를 보면, 아래와 같이 조회되며, CD_ITEM별로 RankNo를 매깁니다.
여기에서, RankNo = 1 인것만을 조회하면, 각 CD_ITEM별 가장 큰 QT_ORDER를 조회하게 됩니다.
PATITION BY 의 항목을 통해서, 파티션 기준을 변경 가능하며,,
ORDER BY 를 변경하여, 큰것이 아니라,작은 것이나 다른 항목을 기준으로도 조회 가능합니다.

SELECT 
	DT_ORDER,
	CD_ITEM,
	QT_ORDER,
	ROW_NUMBER() OVER (PARTITION BY CD_ITEM ORDER BY QT_ORDER DESC) AS RankNo
FROM [NEOE].[ORDER]


반응형
Comments