SQL/MySQL

[MySQL, MariaDB] ROW_NUMBER() 순위함수, 페이징을 위한 다중쿼리

http://portfolio.wonpaper.net 2024. 3. 12. 21:21

row_number() 순위 함수이다. 페이징 작업시 유용하다.

 

그룹으로 묶어서 순서를 줄때는 partition by 칼럼 을 넣어준다.

 

ROW_NUMBER() OVER( partition by name order by no asc ) AS RN

 

SELECT *, ROW_NUMBER() OVER(PARTITION BY name ORDER BY name ASC) AS RN coupon_download  where cno=1

 

 

다만, 유의할 것은 Mysql 5.5, 5.7 등의 버전에서는 ROW_NUMBER() 가 지원되지 않고 8점대 이상에서 지원됨을 유의

 

만약 이 ROW_NUMBER() 가 지원안된다면, 다중쿼리로 조금 복잡하게 처리해야 한다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SELECT
  @rownum := @rownum + 1 AS rn,
  name,
  hp
FROM
  (
    SELECT
      name,
      hp
    FROM
      coupon_download 
    WHERE cno=1 
    GROUP BY
      name,
      hp
   ORDER BY
      name,
      hp      
 
  ) AS t
CROSS JOIN (
  SELECT @rownum := 0
) AS r;
cs

 

name과 hp 별로 그룹핑하였다.

 

이번에는 페이징 처리를 위하여 Limit 10 (레코드수) Offset 0 (페이지 첫번째 순번)  을 넣어보자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
SELECT
  @rownum := @rownum + 1 AS rn,
  name,
  hp
FROM
  (
    SELECT
      name,
      hp
    FROM
      coupon_download 
    WHERE cno=1 
    GROUP BY
      name,
      hp
   ORDER BY
      name,
      hp      
 
  ) AS t
CROSS JOIN (
  SELECT @rownum := 0
) AS r
LIMIT 10 OFFSET 0;
cs

 

 

 

 

 

https://donghodazzi.tistory.com/335

 

[MySQL] ROW_NUMBER() 함수

순위함수(분석함수) 결과에 순번, 순위를 매기는 함수 비집계함수 중 RANK, NTILE, DENSE_RANK, ROW_NUMBER 등이 해당된다. SELECT (arguments) OVER ([PARTITION BY ] ORDER BY ) FROM 테이블명; PARTITION BY : 동일 그룹으로

donghodazzi.tistory.com

 

상기 포스팅 글을 보면 쿼리문과 데이터가 잘 나와 있다.

 

1
2
3
4
5
6
7
8
-- 인구수가 많은 순서대로 랭킹 지정하기
SELECT c.*, ROW_NUMBER() OVER(ORDER BY Population DESC) AS rnk
  FROM city c ;
 
 
-- 도시코드별 인구수 랭킹 지정하기 
SELECT c.*, ROW_NUMBER() OVER(PARTITION BY CountryCode ORDER BY Population DESC) AS rnk
  FROM city c ;
cs

 

 

 

참고 : https://lab.cliel.com/entry/MariaDB-%EC%88%9C%EC%9C%84-%ED%95%A8%EC%88%98

참고 : https://donghodazzi.tistory.com/335