Mysql根据列和顺序计算排名

时间:2013-01-15 18:35:37

标签: mysql

此查询未提供预期结果,

我想做什么:

我正在尝试根据两个不同的列/字段和值对用户进行排名。并且希望在最高级别上显示最高级别的用户。

我在选择查询中创建虚拟列作为RANK并使用两个CASE ... AS RANK。

这是好习惯吗?还是有更好的出路?

PS:我真的不想坚持RANK所以不要存储它们,因为它会从各个领域变得动态(这只是两个领域的例子)

SELECT *, 

CASE EMPLOYEEOF
WHEN 'ASDF' THEN @RANK := @RANK+1 
END AS RANK,

CASE VENDOROF 
WHEN 'WXYZ' THEN @RANK := @RANK+1
END AS RANK

from USERMASTER, (SELECT @RANK := 0) r ORDER BY RANK DESC;
编辑:没有给出!在第1行

1 个答案:

答案 0 :(得分:0)

如果你想从一个表(USERMASTER)中选择,生成一个计算的排名,然后按给定的排名进行排序,这就是你如何有效地做到这一点。

1)确定您的排名标准 - 找出对您的排名至关重要的事项,无论是花费的金额,学生成绩等,了解您的指标会有什么帮助。

2)写下你的逻辑 - 当包含多个条件时,CASE语句很棒。例如,如果你想给GPA高于3.0且等级等于“A”的等级的学生提供更高的等级,但是你想要降低GPA的等级,你可能会说:

SELECT CASE WHEN student_grade = 'A'
            AND student_gpa > 3.0
            THEN 4
       ELSE 3
END rank
FROM students
ORDER BY rank DESC

这将基于student_grade和student_gpa逻辑创建一个排名列,然后根据此计算排名按照最高排名顺序对学生进行排序。

3)测试您的案例 - 通过查看一些示例数据,验证您的逻辑是否为您提供了所需的结果。对于我的例子(因为我不知道你的标准:

student student_grade   student_gpa
John    A           3.5
Mike    B           2.9

运行上面的结果(在student_name上使用group by):

student_name rank
John     4
Mike     3

我的结果与我的预期结果一致(约翰的排名高于4,并且由于订单而出现在我的列表顶部)我们已经完成了!