0

这个查询没有给出预期的结果,

我想做的是:

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

我在选择查询中创建虚拟列作为 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 行

4

1 回答 1

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 rank
John     4
Mike     3

我的结果与我的预期结果一致(John 的排名更高,为 4,并且由于 order by 也显示在我的列表顶部),我们完成了!

于 2013-01-15T19:13:58.630 回答