在RANK函数中跳过关系上的位置

时间:2014-08-18 13:36:35

标签: mysql sql

我想跳过关系上的立场

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上运行该函数。

2 个答案:

答案 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;