我想跳过关系上的立场
CREATE TABLE Persons
(
Name varchar(50),
totalrate int,
nrrates int
);
INSERT INTO Persons (Name, totalrate, nrrates) VALUES
('Albert', 80, 8),
('Ben', 65, 7),
('Brittany', 65, 7),
('Carl', 64, 7),
('Danna', 62, 7);
SELECT `Name`, (`totalrate` / `nrrates`),
@rank_count := @rank_count + (totalrate/nrrates < @prev_value) rank,
@prev_value := totalrate/nrrates avg
FROM Persons, (SELECT @prev_value := NULL, @rank_count := 1) init
ORDER BY avg DESC
我得到了
Name (`totalrate` / `nrrates`) rank avg
Albert 10 1 10
Ben 9.2857 2 9.285714285
Brittany 9.2857 2 9.285714285
Carl 9.1429 3 9.142857142
Danna 8.8571 4 8.857142857
我想跳过第三个位置并且第四个位置没有排名第三
Name (`totalrate` / `nrrates`) rank avg
Albert 10 1 10
Ben 9.2857 2 9.285714285
Brittany 9.2857 2 9.285714285
Carl 9.1429 4 9.142857142
Danna 8.8571 5 8.857142857
我希望有足够的信息来创建表并在我的xammp上的sql上运行该函数。
答案 0 :(得分:1)
您需要引入另一个变量:
SELECT `Name`, (`totalrate` / `nrrates`) as avg,
(@rank_count := if((@rn := (@rn + 1)) > 0,
if((totalrate/nrrates < @prev_value),
@rn,
@rank_count), NULL)
) as rank,
@prev_value := totalrate/nrrates avg
FROM Persons CROSS JOIN
(SELECT @prev_value := NULL, @rank_count := 1, @rn := 0) init
ORDER BY avg DESC;
请注意,我将@rn
的分配放在与@rank_count
相同的表达式中。 MySQL并不保证select
中表达式的评估顺序。如果它们以错误的顺序完成,那么代码将无法满足您的期望。
我没有更改@prev_value
,因为它当前正在工作并重写代码会改变查询的样子 - 隐藏仅添加@rn
的简单更改。
答案 1 :(得分:0)
SELECT *
, FIND_IN_SET(totalrate,(SELECT GROUP_CONCAT(totalrate ORDER BY totalrate DESC) FROM persons )) rank
FROM persons;