DB TABLE 에서 특정 컬럼값 순위로 정렬 및 업데이트

     


테이블에 있는 특정 컬럼의 값으로 정렬한뒤, 그 순위값을 컬럼에 넣어야 하는 경우가 생겼다. 

내가 필요한것은 주식 종목들의 시가총액 순위이다. 1위부터 쭈욱~.

현재 DB에는 시가총액컬럼이 있기는 한데, 순위는 없다. 클라이언트의 요청이 단순히 시가총액 순위로 나열하는거면 order by를 사용한 쿼리로 처리하면 되지만, 이 시가총액 순위값으로 뭔가 하기 때문에 순위값도 가지고 있어야 한다.

가장 클리어한 방법은 DB에 데이터를 적재하는 시점에 같이 넣는것이다. 근데 자체적으로 만드는 데이터가 아니라 수신받는 데이터이기 때문에 중간에 추가하기도 그렇고, 순위를 추가해달라고 하기도 그렇다.

따라서 배치를 돌려서 테이블에 있는 시가총액 컬럼을 내림차순으로 정렬해 순위를 정하고, 순위 컬럼에 그 값을 집어넣는 쿼리를 만들었다.


일단 컬럼을 순위로 정렬하는 건 RANK()함수를 사용하면 된다.

SELECT RANK() OVER (ORDER BY 시가총액 DESC) FROM 테이블;

위에 처럼 하면 시가총액 순으로 RANK가 쫘르륵 매겨진다. 이제 이 값들을 다시 테이블 알맞는 종목에 넣어야 하는데.. 좀 복잡해진다.


UPDATE 테이블 SET 시가총액순위 = (SELECT 순위 FROM (SELECT RANK() OVER (ORDER BY 시가총액 DESC) AS 순위, 종목코드 FROM 테이블 A) WHERE A.종목코드 = B.종목코드;

데이터가 많으면 시간이 좀 걸리겠지만, 같은 테이블 내에 있는 데이터로 RANK를 매길 수 있다. 뭐 서비스 관점에서는 order by 와 limit을 활용해 서비스 할 수도 있지만, 데이터의 특성상 위와같이 배치로 순위를 fix해야 하는 경우가 생긴다. 

데이터 특성에 맞게 바로바로 rank()함수를 이용해서 순위를 뽑던지, 아니면 한 시점에 순위를 뽑아서 저장하던지 결정하면 되겠다.

반응형

댓글

Designed by JB FACTORY