ROW_NUMBER, RANK, DENSE_RANK, NTILE 함수.
전체 데이터에 순위를 부여할 수도 있고, PARTITION 옵션을 사용해 지정 그룹에 따라 그룹 내 순위를 부여할 수 있다.
유일값으로 순위 부여하기: ROW_NUMBER 함수
모든 행에 유일값으로 순위를 부여한다. 같은 순위의 경우 정렬 순서에 따라 순위를 부여한다.
ROW_NUMBER 함수의 기본 형식 |
ROW_NUMBER () OVER([PARTION BY 열, ..., [n] order by 열) |
SELECT symbol, sector,
ROUND(close_price, 0),
ROW_NUMBER() OVER (ORDER BY ROUND(close_price, 0) DESC)
FROM nasdaq_company
해석: nasdaq_company 테이블에서 symbol, sector, close_price 열을 선택해 출력하는데, close_price는 소수첫째자리에서 반올림한 결과이고, close_price 가격이 높은 순서대로 정렬해 순위를 정해 출력하겠다.
결과
symbol sector (열 이름 없음) (열 이름 없음)
BTC-USD NULL 60776 1
^DJI NULL 36328 2
YM=F NULL 34697 3
^N225 NULL 29535 4
NAV Capital Goods 18600 5
다음은 close_price 값이 같으면 symbol 값을 오름차순으로 정렬해 symbol 값이 낮은 쪽에 높은 순위를 부여한 쿼리이다.
SELECT symbol, sector,
ROUND(close_price, 0),
ROW_NUMBER() OVER (ORDER BY ROUND(close_price, 0) DESC, symbol ASC)
FROM nasdaq_company
결과
symbol sector (열 이름 없음) (열 이름 없음)
LRCX Technology 611 61
GHC Miscellaneous 608 62
ZBRA Technology 608 63
AVGO Technology 559 64
그룹별로 순위를 부여하려면 PARTITION 문을 사용해야 한다.
SELECT symbol, sector,
ROUND(close_price, 0),
ROW_NUMBER() OVER (PARTITION BY sector ORDER BY ROUND(close_price, 0) DESC, symbol ASC)
FROM nasdaq_company
결과
symbol sector (열 이름 없음) (열 이름 없음)
HYMCW Basic Industries 0 220
HYMCZ Basic Industries 0 221
ITP Basic Industries 0 222
NAV Capital Goods 18600 1
NVR Capital Goods 5089 2
TSLA Capital Goods 1222 3
같은 순위 개수 고려해 순위 부여하기: RANK 함수
값은 순위일 때 같은 값을 부여한다. 1순위가 3개면 다음 순위는 2가 아니라 4가 된다.
RANK 함수의 기본 형식 |
RANK () OVER([PARTION BY 열, ..., [n] order by 열) |
SELECT symbol, sector,
ROUND(close_price, 0),
RANK() OVER (ORDER BY ROUND(close_price, 0) DESC)
FROM nasdaq_company
결과
symbol sector (열 이름 없음) (열 이름 없음)
SYNA Technology 249 211
CVCO Basic Industries 248 212
HCA Health Care 248 212
IQV Health Care 247 214
MSI Technology 247 214
W Consumer Services 246 216
같은 순위 개수 무시하고 순위 부여하기: DENSE_RANK 함수
값은 순위 개수를 무시한다. 1순위가 3개면 다음 순위는 2가 된다.
DENSE_RANK 함수의 기본 형식 |
DENSE_RANK () OVER([PARTION BY 열, ..., [n] order by 열) |
SELECT symbol, sector,
ROUND(close_price, 0),
DENSE_RANK() OVER (ORDER BY ROUND(close_price, 0) DESC)
FROM nasdaq_company
결과
symbol sector (열 이름 없음) (열 이름 없음)
EL Consumer Non-Durables 350 111
MA Miscellaneous 349 112
ODFL Transportation 349 112
ABMD Health Care 345 113
SEDG Technology 344 114
SBAC Consumer Services 344 114
SAIA Transportation 343 115
그룹화 해 순위 부여하기: NTILE 함수
인자로 지정한 값만큼 데이터 행을 그룹화해 그룹별 순위를 부여한다. 각 그룹은 1부터 순위가 매겨지며 순위는 각 행의 순위가 아닌 행이 속한 그룹의 순위다.
NTILE 함수의 기본 형식 |
NTILE (integer_expression) OVER([PARTION BY 열, ..., [n] order by 열) |
SELECT symbol, sector,
ROUND(close_price, 0),
NTILE(1000) OVER (ORDER BY ROUND(close_price, 0) DESC)
FROM nasdaq_company
결과
symbol sector (열 이름 없음) (열 이름 없음)
BTC-USD NULL 60776 1
^DJI NULL 36328 1
YM=F NULL 34697 1
^N225 NULL 29535 1
NAV Capital Goods 18600 1
^IXIC NULL 15972 1
NQ=F NULL 15487 1
^FTSE NULL 7304 1
NVR Capital Goods 5089 1
^GSPC NULL 4698 2
ES=F NULL 4464 2
ETH-USD NULL 4289 2
전체 8918행을 1000개 행으로 나누어서 각 행이 속한 그룹의 순위를 부여한 것이다. NTILE 함수는 전체 행을 균등하게 나누어 어떠한 그룹을 생성해야 할 때 사용하기 좋다. 전체 행 수가 행의 개수로 정확하게 나누어 떨어지지 않으면 나머지 행은 마지막 그룹에 할당된다.
'IT Story > SQL Story' 카테고리의 다른 글
주가 분석하기 (0) | 2022.12.06 |
---|---|
SQL 함수: 분석 함수 (0) | 2022.12.06 |
SQL 함수: 수학 함수 (0) | 2022.12.05 |
SQL 함수: 집계 함수 (0) | 2022.12.05 |
SQL 함수: 날짜 함수 (0) | 2022.12.02 |