hackerrank - MySql rank如何实现

本文介绍了在MySQL中如何使用user-defined variables实现类似SQL Server和Oracle的row_number(), rank()和dense_rank()排序功能。通过示例展示了如何为表格中的数据进行排序,以及处理并列排名的情况,并提供了相关查询的语法结构。" 5382215,77169,使用CACTI监控H3C设备CPU和内存的步骤,"['网络监控', 'H3C设备', 'SNMP监控', 'CACTI配置', '设备管理']
摘要由CSDN通过智能技术生成

MySQL:

  1. 使用user-defined variable来给table进行普通排序

比如Player table如下:

pidnameage

1

Samual25
2Vino20
3John20
4Andy22
5Brian21
6Dew24
7Kris25
8William26
9George23
10Peter19
11Tom20
12Andre20

 

Select pid, name, age, @curRank := @curRank +1 as rank

From Player p, (select @curRank := 0) c

Order by age asc;

得到排序后的table如下:

| PID |    NAME | AGE | RANK |
|-----|---------|-----|------|
|  10 |   Peter |  19 |    1 |
|  12 |   Andre |  20 |    2 |
|   2 |    Vino |  20 |    3 |
|   3 |    John |  20 |    4 |
|  11 |     Tom |  20 |    5 |
|   5 |   Brian |  21 |    6 |
|   4 |    Andy |  22 |    7 |
|   9 |  George |  23 |    8 |
|   6 |     Dew |  24 |    9 |
|   7 |    Kris |  25 |   10 |
|   1 |  Samual |  25 |   11 |
|   8 | William |  26 |   12 |

要在mysql中声明一个变量,你必须在变量名之前使用@符号。FROM子句中的(@curRank := 0)部分允许我们进行变量初始化,而不需要单独的SET命令。当然,也可以使用SET,但它会处理两个查询:

SET @curRank := 0;
SELECT pid, name, age, @curRank := @curRank + 1 AS rank
FROM players
ORDER BY age

这个排序相当于MSSQL和Orcle中的row_number()排序

2. 为并列的数据实现相同的排名

为并列数据的行赋予相同的排名,则意味着那些在排名比较列中具有相同值的行应在MySQL中计算排名时保持相同的排名,为此我们使用的一个额外变量:

SELECT pid, name, age, 
CASE 
WHEN @prevRank = age THEN @curRank 
WHEN @prevRank := age THEN @curRank := @curRank + 1
END AS rank
FROM players p, 
(SELECT @curRank :=0, @prevRank := NULL) r
ORDER BY age
| PID |    NAME | AGE | RANK |
|-----|---------|-----|------|
|  10 |   Peter |  19 |    1 |
|  12 |   Andre |  20 |    2 |
|   2 |    Vino |  20 |    2 |
|   3 |    John |  20 |    2 |
|  11 |     Tom |  20 |    2 |
|   5 |   Brian |  21 |    3 |
|   4 |    Andy |  22 |    4 |
|   9 |  George |  23 |    5 |
|   6 |     Dew |  24 |    6 |
|   7 |    Kris |  25 |    7 |
|   1 |  Samual |  25 |    7 |
|   8 | William |  26 |    8 |

此排序方式相当于MSSQL和Orcle中的dense_rank()排序

3. 实现高级并列函数排名

当使用RANK()函数时,如果两个或以上的行排名并列,则相同的行都会有相同的排名,但是下一个排名会空出之前排名所占的位子。

SELECT pid, name, age, rank FROM
(SELECT pid, name, age,
@curRank := IF(@prevRank = age, @curRank, @incRank) AS rank, 
@incRank := @incRank + 1, 
@prevRank := age
FROM players p, (
SELECT @curRank :=0, @prevRank := NULL, @incRank := 1
) r 
ORDER BY age) s

这是一个查询中的子查询。我们使用三个变量(@incRank,@prevRank,@curRank)来计算关系的情况下,在查询结果中我们已经补全了因为并列而导致的排名空位。我们已经封闭子查询到查询。

| PID |    NAME | AGE | RANK |
|-----|---------|-----|------|
|  10 |   Peter |  19 |    1 |
|  12 |   Andre |  20 |    2 |
|   2 |    Vino |  20 |    2 |
|   3 |    John |  20 |    2 |
|  11 |     Tom |  20 |    2 |
|   5 |   Brian |  21 |    6 |
|   4 |    Andy |  22 |    7 |
|   9 |  George |  23 |    8 |
|   6 |     Dew |  24 |    9 |
|   7 |    Kris |  25 |   10 |
|   1 |  Samual |  25 |   10 |
|   8 | William |  26 |   12 |

reference:https://www.jianshu.com/p/bb1b72a1623e

https://fellowtuts.com/mysql/query-to-obtain-rank-function-in-mysql/



  • row_number()排序:row_number() over( [partition by ...] order by clause)
  • rank()排序:RANK() OVER ([PARTITION BY partition_expression, ... ] ORDER BY sort_expression [ASC | DESC], ...)
  • dense_rank()排序:

2

3

4

DENSE_RANK() OVER (

    [PARTITION BY partition_expression, ... ]

    ORDER BY sort_expression [ASC | DESC], ...

)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值