Połączenie odpowiedzi Daniela i Salmana. Jednak ranga nie da, ponieważ kontynuuje się sekwencję z powiązaniami. Zamiast tego pomija ranking do następnego. Maksymalnie zawsze osiągaj liczbę wierszy.
SELECT first_name,
age,
gender,
IF([email protected]_last_age,@curRank:[email protected],@curRank:[email protected]_sequence) AS rank,
@_sequence:[email protected]_sequence+1,@_last_age:=age
FROM person p, (SELECT @curRank := 1, @_sequence:=1, @_last_age:=0) r
ORDER BY age;
Schema i Test Case:
CREATE TABLE person (id int, first_name varchar(20), age int, gender char(1));
INSERT INTO person VALUES (1, 'Bob', 25, 'M');
INSERT INTO person VALUES (2, 'Jane', 20, 'F');
INSERT INTO person VALUES (3, 'Jack', 30, 'M');
INSERT INTO person VALUES (4, 'Bill', 32, 'M');
INSERT INTO person VALUES (5, 'Nick', 22, 'M');
INSERT INTO person VALUES (6, 'Kathy', 18, 'F');
INSERT INTO person VALUES (7, 'Steve', 36, 'M');
INSERT INTO person VALUES (8, 'Anne', 25, 'F');
INSERT INTO person VALUES (9, 'Kamal', 25, 'M');
INSERT INTO person VALUES (10, 'Saman', 32, 'M');
wyjściowa:
+------------+------+--------+------+--------------------------+-----------------+
| first_name | age | gender | rank | @_sequence:[email protected]_sequence+1 | @_last_age:=age |
+------------+------+--------+------+--------------------------+-----------------+
| Kathy | 18 | F | 1 | 2 | 18 |
| Jane | 20 | F | 2 | 3 | 20 |
| Nick | 22 | M | 3 | 4 | 22 |
| Kamal | 25 | M | 4 | 5 | 25 |
| Anne | 25 | F | 4 | 6 | 25 |
| Bob | 25 | M | 4 | 7 | 25 |
| Jack | 30 | M | 7 | 8 | 30 |
| Bill | 32 | M | 8 | 9 | 32 |
| Saman | 32 | M | 8 | 10 | 32 |
| Steve | 36 | M | 10 | 11 | 36 |
+------------+------+--------+------+--------------------------+-----------------+
odpowiedzi podane poniżej albo nie zrobić partycję lub wytworzeniem DENSE_RANK zamiast rangi. Połączone pytanie obejmuje tylko ROW_NUMBER(), który różni się od RANK(). Bezwstydne samopromocyjne rozwiązanie dla prawdziwej [funkcji analitycznej ROW_NUMBER(), RANK(), DESNSE_RANK()] (http://kennethxu.blogspot.com/2016/04/analytical-function-in-mysql-rownumber.html) w MySQL –