ORACLE的CASE函数和RANK函数套用,这是查询代码中的一部分,代码没问题...
发布网友
发布时间:2022-04-28 15:38
我来回答
共2个回答
热心网友
时间:2022-04-09 05:18
CASE WHEN wst.score - 60 < 0 THEN ---当wst.score <60的时候执行开窗函数RANK() OVER
RANK() OVER (PARTITION BY 当wst.score <60的时候,如果wst.score >=60直为null,否则的话当作'A',--〉最终结果是按照wst.score <60(也就是null) 和 'A'分组
CASE WHEN wst.score - 60 >= 0 THEN NULL
ELSE 'A' END ORDER BY wst.score DESC
)
END
整个就是
1)如果wst.score <60
1.1按照 <60('A'). >=60(NULL)分组,注意,此时分组的是A和null
1.2按照A和NULL分组后按照wst.score组内降序排列
所以说你那个SQL语句性能很不好,可以优化的。你可以给个例子和你想要得结果,我可以帮你看看能否改进。
另外,你最外层那个CASE没有else,程序很不健壮哦。。。
热心网友
时间:2022-04-09 06:36
CASE WHEN 相当于 IF/ELSE 的功能
CASE WHEN wst.score - 60 < 0 THEN
RANK() OVER (PARTITION BY
CASE WHEN wst.score - 60 >= 0 THEN NULL ELSE 'A' END ORDER BY wst.score DESC
)
END adjust_flag
也就是
当 wst.score - 60 < 0 的情况下, 一个分支
当 wst.score - 60 >= 0 的情况下, NULL
其他情况下,是 'A'
RANK 排名不连续, 功能与 ROW_NUMBER 类似
按照分数 排名 从高到底
SELECT
RANK() OVER( ORDER BY SUM(grade) DESC) AS NO,
student_name,
SUM(grade) AS AllGrade
FROM
test_course
GROUP BY
student_name
ORDER BY
SUM(grade) DESC
1 甲 185
1 奎 185
3 壬 165
3 乙 165
5 丙 145
6 辛 140
7 丁 125
8 庚 120
9 戊 105
10 己 100
DENSE_RANK 排名连续
按照分数 排名 从高到底
SELECT
DENSE_RANK() OVER( ORDER BY SUM(grade) DESC) AS NO,
student_name,
SUM(grade) AS AllGrade
FROM
test_course
GROUP BY
student_name
ORDER BY
SUM(grade) DESC
1 甲 185
1 奎 185
2 壬 165
2 乙 165
3 丙 145
4 辛 140
5 丁 125
6 庚 120
7 戊 105
8 己 100