【SQL】row_number가 없는 MySQL에서 사용자 변수를 사용하지 않고 일련 번호를 흔들어

소개



예를 들어 oracle에서는 row_number() 같은 분석 함수가 준비되어 있지만 MySQL에서는 row_number()가 없으므로 서브 쿼리를 사용하여 일련 번호를 흔들려고 생각합니다.

샘플 데이터



적당히 만든 테스트 성적표를 사용합니다.


이름
과목
점수


sato
Math
65

morita
과학
85

tahakashi
Math
45

이시이
영어
75

이시이
Math
40

tahakashi
과학
60

시미즈
영어
55

나카지마
영어
70


점수가 높은 순서로 정렬하여 일련 번호를 흔들어



위의 샘플 데이터를 다음과 같이 표시합니다. 일단 과목은 묻지 않습니다.
학교라면, 점수가 높은 순서로 게시판에 튀어나오는 아레입니다


No.
이름
과목
점수


1
morita
과학
85

2
이시이
영어
75

3
나카지마
영어
70

4
sato
Math
65

5
tahakashi
과학
60

6
시미즈
영어
55

7
tahakashi
Math
45

8
이시이
Math
40


실행된 SQL


select
  (select count(*)+1 from テストの成績表 where 点数 >x.点数) as 'No.'
  , 名前, 科目, 点数
from テストの成績表 as x
order by x.点数 desc
;

해설



"점수가 높은 순서로"라는 것이므로 order by x.点数 desc로 정렬합니다.
그 때, 「자신보다 점수가 높은 레코드가 몇건 있는가」를 산출하고 있는 것이 이 서브 쿼리입니다.
select count(*)+1 from テストの成績表 where (比較対象の)点数 >x.(自分の)点数

1위morita / Science / 85 님보다 높은 점수를 기록한 레코드는 0개입니다.
그 때문에, 「자신보다 점수가 높은 레코드의 건수」에 +1 하지 않으면, 1로부터 시작되는 일련번호가 되지 않는다고 하는 것입니다.
포인트는, 「재귀 집합이 되어 있다」 것 count(*) 하는 요소수가 반드시 하나씩 늘어나는 것이 보증됩니다.
덧붙여서, 점수가 낮은 순서로 일련번호를 흔들고 싶으면, where 点数 <x.点数 와 부등호의 방향을 반대로 합니다.

점수가 높은 순서로 정렬하고 과목별로 일련 번호를 흔든다.



위의 예라면 사용하기 어려운 적어도 과목마다 순위 붙이지요 ...라는 것으로, 다음과 같이 표시해 보겠습니다.


No.
이름
과목
점수


1
이시이
영어
75

2
나카지마
영어
70

3
시미즈
영어
55

1
sato
Math
65

2
tahakashi
Math
45

3
이시이
Math
40

1
morita
과학
85

2
tahakashi
과학
60


실행된 SQL


select
  (select count(*)+1 from テストの成績表
   where 科目 = x.科目 and 点数 > x.点数
  ) as 'No.'
  , 名前, 科目, 点数
from テストの成績表 as x
order by x.科目, x.点数 desc
;

해설



과목과 점수로 정렬하고 싶으므로 일단 order by x.科目, x.点数 desc 합니다.
"과목마다 일련번호"란, 즉 "같은 과목 안에 점수가 높은 레코드가 몇 건 있을까"라고도 말할 수 있으므로, 서브 쿼리 부분은 이렇게 됩니다
select count(*)+1 from テストの成績表
where
  (比較対象の)科目 = x.(自分の)科目
  and (比較対象の)点数 > x.(自分の)点数

하는 일은 조금 전과 같습니다. 과목이 일치하는지 여부를 보면 일련 번호를 재설정 할 수 있다는 카라 쿠리입니다

요약


row_number() 를 사용할 수 없어도 일련 번호를 흔들 수 있습니다.
다만, 테이블의 스캔이 2회가 되므로, row_number() 가 있다면, 솔직하게 row_number() 를 사용하는 것이 퍼포먼스는 올라갑니다.

그렇다고는 해도, 생각의 하나로서, 알아 두어도 좋을까라고 생각합니다.



참고문헌



웹사이트



SQL 아타마 아카데미
제1회 연속번호의 특성을 이용하여 데이터 조작을 보다 자유롭게 SQL로 연속번호를 취급한다
(2) 행 집합에 일련 번호 지정
h tp // 기효. jp/에서 v/세리아 l/01/sql_아카로 my2/000102



SQL 실습 입문 ── 빠르고 이해하기 쉬운 쿼리 작성 WEB+DB PRESS plus
2015년 4월 11일 발매
믹의 저
h tp // 기효. jp/보오 k/2015/978ー4ー7741ー7301ー6

샘플 데이터



이번 샘플 데이터를 생성한 create table문과 insert문은 이쪽
create table testScore(name varchar(30), subject varchar(100), score integer);
insert into testScore(name, subject, score) values("sato", "Math", 65);
insert into testScore(name, subject, score) values("morita", "Science", 85);
insert into testScore(name, subject, score) values("tahakashi", "Math", 45);
insert into testScore(name, subject, score) values("ishii", "English", 75);
insert into testScore(name, subject, score) values("ishii", "Math", 40);
insert into testScore(name, subject, score) values("tahakashi", "Science", 60);
insert into testScore(name, subject, score) values("shimizu", "English", 55);
insert into testScore(name, subject, score) values("nakajima", "English", 70);

좋은 웹페이지 즐겨찾기