mysql - 基于一个表中的列进行排名

标签 mysql sql postgresql

我有一个简单的表 User 有两个属性 IDAGE 现在我想根据 AGE

获得“排名”结果
 User Table

ID      AGE
0        23
1        35
2        30
3        52
4        35
5        23
6        19

如果我执行 select * from User order by AGE ASC 我可以很容易地得到如下排序结果:

ID      AGE
6        19
0        23
5        23
2        30
1        35
4        35
3        52

但我真正想得到的是:

ID      RANK
6        0
0        1
5        1
2        3
1        4
4        4
3        6

我在下面想出了一个很好的解决方案,但它有一个小瑕疵

SELECT U1.ID, count(*) AS RANK
FROM User U1, User U2
WHERE U1.age > U2.age
GROUP BY U1.ID ORDER BY RANK;

这给了我:

ID      RANK
0        1
5        1
2        3
1        4
4        4
3        6

这是正确的,除了我失去了排名零,因为 WHERE U1.age > U2.age 对最年轻的用户来说永远不是真的。

请说明这个问题,在此先感谢!

最佳答案

不幸的是,MySQL 仍然缺乏对分析函数的支持。在 MySQL 中模拟 RANK() 的一种方法

SELECT id, rank
  FROM
(
  SELECT id, @n := @n + 1, @r := IF(@a = age, @r, @n) rank, @a := age
    FROM user CROSS JOIN (SELECT @n := -1, @r := -1, @a := NULL) i
   ORDER BY age
) q

输出:

| ID | RANK |
|----|------|
|  6 |    0 |
|  0 |    1 |
|  5 |    1 |
|  2 |    3 |
|  1 |    4 |
|  4 |    4 |
|  3 |    6 |

Here is SQLFiddle demo


You should've told in your question that you actually using Postgres in the first place.'

Unfortunately @t-clausen.dk deleted his answer that is absolutely correct in the light of the discovered fact of you using Postgres which supports analytic functions

SELECT ID, RANK() OVER (ORDER BY age) - 1 rank
  FROM "user"

这是最好的方法。

这是 SQLFiddle 演示

关于mysql - 基于一个表中的列进行排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19784165/

相关文章:

mysql - #1054 - 'Owner' 中的未知列 'field list'

sql - 当在很多地方使用 GETDATE() 时,使用变量是不是更好?

sql - 如果我使用包含 5 个字符的搜索文本,Postgresql 不会使用索引。有 6 个就可以了。为什么?

SQL如何按州选择交易金额最高的客户

PHP 调用 Postgres void 函数

android - 无法将用户登录详细信息从数据库检索到我的 Android 应用程序中

php - 使用 mysql 显示特定国家/地区的 Web 内容的最佳方式

MySQL 按匹配数排序

mysql - 优先于列的条件排序

postgresql - 在 200 多万条记录上提高 postgresql-9.5 的性能