mysql - MySQL对具有关系的列进行排名
问题描述
给定具有以下架构的 Scores 表
+----+-------+
| Id | Score |
+----+-------+
| 1 | 3.50 |
| 2 | 3.65 |
| 3 | 4.00 |
| 4 | 3.85 |
| 5 | 4.00 |
| 6 | 3.65 |
+----+-------+
我尝试了以下方法:
SET @prev_value = NULL;
SET @rank_count = 0;
SELECT Id, Score, CASE
WHEN @prev_value = Score THEN @rank_count
WHEN @prev_value := Score THEN @rank_count := @rank_count + 1
END AS Rank
FROM Scores
ORDER BY Score
为了得到
+-------+------+
| Score | Rank |
+-------+------+
| 4.00 | 1 |
| 4.00 | 1 |
| 3.85 | 2 |
| 3.65 | 3 |
| 3.65 | 3 |
| 3.50 | 4 |
+-------+------+
但是我得到了这个错误:
Line 3: SyntaxError: near 'SET @rank_count = 0;
SELECT Id, Score, CASE
WHEN @prev_value := Score THEN @'
我做错了什么?
解决方案
您可以使用变量。我认为您只需要一个查询:
SELECT Id, Score,
(CASE WHEN @prev_value = Score THEN @rank_count
WHEN @prev_value := Score THEN @rank_count := @rank_count + 1
END) AS Rank
FROM (SELECT s.*
FROM Scores s
ORDER BY Score s
) s CROSS JOIN
(SELECT @prev_value := NULL, @rank_count := 0) params;
更新版本的 MySQL 需要在子查询中进行排序。当然,最新版本提供DENSE_RANK()
了更好的选择。
推荐阅读
- firebase - 这种使用两个查询的方法会减少 Firestore 读取计数吗?
- mysql - 在 MySQL 中显示员工资料
- c++ - 无法在代码块上构建 C++ 项目
- java - 我可以通过不同的方法为给定数组获得多个完整的二叉树吗?
- javascript - 如何使用 npm 包?
- python - Python:从 INT 转换为 BYTES 问题
- web-scraping - 将爬网数据导出到 csv
- matlab - 从在 MATLAB App 设计器中创建的 GUI 中的表中复制选定的值
- flutter - 缺少 default_value_for 参数颤动
- sql - GORM SQL 优化