pbj0812의 코딩 일기

[SQL] @rownum을 사용한 랭크 매기기 본문

ComputerLanguage_Program/SQL

[SQL] @rownum을 사용한 랭크 매기기

pbj0812 2020. 7. 30. 01:40

0. 목표

 - @rownum을 사용한 카테고리별 순서 매기기

  * MySQL 8 이상이면 윈도우 함수 쓰는게 정신에 이로움

1. 실습

 1) 테이블 생성

CREATE TABLE pbj_db.rownum_test
(
    id INT NOT NULL,
    body VARCHAR(32) NOT NULL
) ENGINE = INNODB;

 2) 데이터 삽입

INSERT INTO pbj_db.rownum_test(id, body) VALUES(1, 'a');
INSERT INTO pbj_db.rownum_test(id, body) VALUES(1, 'b');
INSERT INTO pbj_db.rownum_test(id, body) VALUES(2, 'b');
INSERT INTO pbj_db.rownum_test(id, body) VALUES(3, 'c');
INSERT INTO pbj_db.rownum_test(id, body) VALUES(4, 'c');
INSERT INTO pbj_db.rownum_test(id, body) VALUES(5, 'c');

 3) 확인

SELECT body, id FROM pbj_db.rownum_test;

  - 결과

 4) @rownum을 사용한 순서 매기기

SELECT
	@rownum := @rownum+1, A.id, A.body
FROM pbj_db.rownum_test as A, (SELECT @rownum:=0) AS B;

 - 결과

 5) body별 순서 매기기

  (1) B 테이블을 정의한 뒤 @tmp에 절대 테이블에 들어올 수 없는 값을 입력하고 @rownum에는 0을 입력

  (2) @tmp가 만약 해당 행의 body의 내용과 같다면 1을 더하고 아니면 1로 초기화(첫 시도의 @tmp에는 공란이 저장되어 있기에 @rownum이 0에서 1로 초기화)

  (3) 반복

SELECT
    C.body,
    C.id,
    C.rnum
FROM (
	SELECT 
		A.body,
        A.id,
		(CASE @tmp 
			WHEN A.body THEN @rownum := @rownum + 1 
			ELSE @rownum := 1 END) rnum,
		(@tmp := A.body) tmp
	FROM pbj_db.rownum_test AS A, (SELECT @tmp := '', @rownum := 0 FROM DUAL) B
	ORDER BY A.body, A.id                  
) AS C

  - 결과

2. 참고

 - [MySQL] Oracle의 그룹별 번호 매기기와 같은 기능 구현하기

 - [MySQL] ROWNUMBER을 사용하여 번호매기기

Comments