はじめに
このようなテーブルに対して点数の昇順に連番を振る
氏名 | 点数 |
---|---|
佐藤 | 80 |
鈴木 | 70 |
高橋 | 90 |
田中 | 80 |
山田 | 80 |
スキーマ
CREATE TABLE 成績表(氏名 varchar(4), 点数 int);
INSERT INTO 成績表(氏名, 点数)
VALUES ('佐藤', 80),
('鈴木', 70),
('高橋', 90),
('田中', 80),
('山田', 80);
分析関数の場合
ROW_NUMBER
SELECT ROW_NUMBER() OVER(ORDER BY 点数) AS 番号
, Z.*
FROM 成績表 AS Z;
実行結果
番号 | 氏名 | 点数 |
---|---|---|
1 | 鈴木 | 70 |
2 | 佐藤 | 80 |
3 | 山田 | 80 |
4 | 田中 | 80 |
5 | 高橋 | 90 |
DENSE_RANK
SELECT DENSE_RANK() OVER(ORDER BY 点数) AS 番号
, Z.*
FROM 成績表 AS Z;
実行結果
番号 | 氏名 | 点数 |
---|---|---|
1 | 鈴木 | 70 |
2 | 佐藤 | 80 |
2 | 田中 | 80 |
2 | 山田 | 80 |
3 | 高橋 | 90 |
RANK
SELECT RANK() OVER(ORDER BY 点数) AS 番号
, Z.*
FROM 成績表 AS Z;
実行結果
番号 | 氏名 | 点数 |
---|---|---|
1 | 鈴木 | 70 |
2 | 佐藤 | 80 |
2 | 田中 | 80 |
2 | 山田 | 80 |
5 | 高橋 | 90 |
分析関数を使わない方法
ROW_NUMBERと同じ結果を得る方法
SELECT @rank := @rank + 1 AS 番号
, Z.*
FROM (SELECT * FROM 成績表 ORDER BY 点数) AS Z
, (SELECT @rank:=0) AS X;
実行結果
番号 | 氏名 | 点数 |
---|---|---|
1 | 鈴木 | 70 |
2 | 佐藤 | 80 |
3 | 田中 | 80 |
4 | 山田 | 80 |
5 | 高橋 | 90 |
DENSE_RANK と同じ結果を得る方法
SELECT @rank :=
CASE
WHEN @rankval = 点数 THEN @rank
ELSE @rank + 1
END AS 番号
, @rankval := 点数 AS rankval
, Z.*
FROM (SELECT * FROM 成績表 ORDER BY 点数) AS Z
, (SELECT @rank:=0, @rankval:=NULL) AS X;
実行結果
番号 | rankval | 氏名 | 点数 |
---|---|---|---|
1 | 70 | 鈴木 | 70 |
2 | 80 | 佐藤 | 80 |
2 | 80 | 田中 | 80 |
2 | 80 | 山田 | 80 |
3 | 90 | 高橋 | 90 |
RANKと同じ結果を得る方法
SELECT @rank :=
CASE
WHEN @rankval = 点数 THEN @rank
ELSE @rank + @gap + 1
END AS 番号
, @gap :=
CASE
WHEN @rankval = 点数 THEN @gap + 1
ELSE 0
END AS gap
, @rankval := 点数 AS rankval
, Z.*
FROM (SELECT * FROM 成績表 ORDER BY 点数) AS Z
, (SELECT @rank:=0, @rankval:=NULL, @gap:=0) AS X;
実行結果
番号 | gap | rankval | 氏名 | 点数 |
---|---|---|---|---|
1 | 0 | 70 | 鈴木 | 70 |
2 | 0 | 80 | 佐藤 | 80 |
2 | 1 | 80 | 田中 | 80 |
2 | 2 | 80 | 山田 | 80 |
5 | 0 | 90 | 高橋 | 90 |
お試し
参考記事