当前位置: 首页 > 面试题库 >

MySQL中的排名函数

虞裕
2023-03-14
问题内容

我需要找出客户的等级。在这里,我为我的需求添加了相应的ANSI标准SQL查询。请帮助我将其转换为MySQL。

SELECT RANK() OVER (PARTITION BY Gender ORDER BY Age) AS [Partition by Gender], 
  FirstName, 
  Age,
  Gender 
FROM Person

有什么功能可以找出MySQL的排名吗?


问题答案:

一种选择是使用排名变量,例如:

SELECT    first_name,
          age,
          gender,
          @curRank := @curRank + 1 AS rank
FROM      person p, (SELECT @curRank := 0) r
ORDER BY  age;

(SELECT @curRank := 0)部分允许变量初始化,而无需单独的SET命令。

测试用例:

CREATE TABLE person (id int, first_name varchar(20), age int, gender char(1));

INSERT INTO person VALUES (1, 'Bob', 25, 'M');
INSERT INTO person VALUES (2, 'Jane', 20, 'F');
INSERT INTO person VALUES (3, 'Jack', 30, 'M');
INSERT INTO person VALUES (4, 'Bill', 32, 'M');
INSERT INTO person VALUES (5, 'Nick', 22, 'M');
INSERT INTO person VALUES (6, 'Kathy', 18, 'F');
INSERT INTO person VALUES (7, 'Steve', 36, 'M');
INSERT INTO person VALUES (8, 'Anne', 25, 'F');

结果:

+------------+------+--------+------+
| first_name | age  | gender | rank |
+------------+------+--------+------+
| Kathy      |   18 | F      |    1 |
| Jane       |   20 | F      |    2 |
| Nick       |   22 | M      |    3 |
| Bob        |   25 | M      |    4 |
| Anne       |   25 | F      |    5 |
| Jack       |   30 | M      |    6 |
| Bill       |   32 | M      |    7 |
| Steve      |   36 | M      |    8 |
+------------+------+--------+------+
8 rows in set (0.02 sec)


 类似资料:
  • 问题内容: 我需要创建一个自动在结果中添加虚拟行号的视图。这里的图完全是随机的,我要实现的是动态创建的最后一列。 查询: 问题答案: 采用: 这不是理想的方式,因为将对返回的每一行执行num值查询。更好的主意是创建一个表,其中的一列包含一个从一个开始的数字,然后递增到一个非常大的数字,然后以类似于下面的变量示例的方式联接和引用该表。 MySQL排名,或缺乏 您可以定义一个变量以获得伪行号功能,因为

  • 问题内容: 我有一个表格播放器的以下表格结构 假设玩家ID和得分具有有效值,是否可以基于单个查询中的得分数量来更新所有玩家的排名?如果两个人的分数相同,则应该并列。 更新: 我正在使用建议作为本机查询的查询使用hibernate模式。Hibernate不喜欢使用变量,尤其是’:’。有人知道任何解决方法吗?是通过不使用变量,还是在这种情况下通过使用HQL解决hibernate的限制? 问题答案: 一

  • 问题内容: 我有一个包含3个字段的表,我想根据user_id和game_id对列进行排名。 这是SQL Fiddle:http ://sqlfiddle.com/#!9/883e9d/1 我已经在桌子上了: 预期产量: 到目前为止,我的努力: 编辑:( 来自OP 注释):排序基于的降序 game_detail的顺序 问题答案: 在派生表(子句内的子查询)中,我们对数据进行排序,以使所有具有相同值的

  • 问题内容: 以下是我所拥有的 我想要的是如下 注意: 我在输出下面创建的代码, 代码是 我希望用户6具有as 而不是 问题答案: 那这个呢?

  • 问题内容: 我完全为在mysql中从rank()over(按x分区,按y desc排序)创建新列“ LoginRank”而感到困惑。 从SQL Server,我将编写以下查询,以创建按“登录”分组并按“ id”排序的“ Loginrank”列。 我有下表。 我尝试将许多现有的mysql修复程序应用到我的数据集,但仍然存在问题。 任何帮助是极大的赞赏。谢谢! 问题答案: 请尝试以下查询:-MySql

  • null 本质上,我要查询的是该实体的前20名。有了mysql和一个cron工作,我每分钟都在更新hotscore。因此,热得分不能适用于分区键。我在试着看看我是否能在搬到C*之前做到这一点。据我所知,像这样的主键不太好,因为这意味着C*必须扫描每个条目。