`
zhoukai
  • 浏览: 17852 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

mysql模拟rank, dense_rank

 
阅读更多
参考http://stackoverflow.com/questions/532878/how-to-perform-grouped-ranking-in-mysql
CREATE TABLE `test` (
  `student_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `subject` varchar(10) CHARACTER SET latin1 DEFAULT NULL,
  `score` tinyint(4) DEFAULT NULL,
  PRIMARY KEY (`student_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

insert  into `test`(`id`,`student_id`,`subject_name`,`score`) values (1,1,'yw',80);
insert  into `test`(`id`,`student_id`,`subject_name`,`score`) values (2,1,'sx',90);
insert  into `test`(`id`,`student_id`,`subject_name`,`score`) values (3,2,'yw',85);
insert  into `test`(`id`,`student_id`,`subject_name`,`score`) values (4,2,'sx',95);
insert  into `test`(`id`,`student_id`,`subject_name`,`score`) values (5,3,'yw',70);
insert  into `test`(`id`,`student_id`,`subject_name`,`score`) values (6,3,'sx',100);
insert  into `test`(`id`,`student_id`,`subject_name`,`score`) values (7,4,'yw',70);
insert  into `test`(`id`,`student_id`,`subject_name`,`score`) values (8,4,'sx',70);

subject_name: 科目 yw:语文 sx:数学
dense_rank
select subject_name as sbn , student_id as sid, score, 
@rank:=case when @sn <> subject_name then 1 when @score <> score then @rank+1 else @rank+0 end as rank, 
@sn := subject_name as sn, 
@score := score as score 
from `test` p, 
(select @rank := 0) r, 
(select @sn := '') u, 
(select @score := -1) i 
order by subject_name, score;


result:

sbn	sid	score	rank	sn	score
sx	4	70	1	sx	70
sx	1	90	2	sx	90
sx	2	95	3	sx	95
sx	3	100	4	sx	100
yw	3	70	1	yw	70
yw	4	70	1	yw	70
yw	1	80	2	yw	80
yw	2	85	3	yw	85



rank

select subject_name as sbn, student_id as sid, score, 
@rank:=case when @sn <> subject_name then 1 when @score <> score then @rank+@range else @rank+0 end as rank, 
@range:=case when @sn <> subject_name then 1 when @score = score then @range+1 else 1 end as ran , 
@sn := subject_name as sn, @score := score as sc
from `test` p, (select @rank := 0) r, 
(select @sn := '') u, (select @score := -1) i, (select @range := 1) g 
order by subject_name, score;


sbn	sid	score	rank	ran	sn	sc
sx	4	70	1	1	sx	70
sx	1	90	2	1	sx	90
sx	2	95	3	1	sx	95
sx	3	100	4	1	sx	100
yw	3	70	1	1	yw	70
yw	4	70	1	2	yw	70
yw	1	80	3	1	yw	80
yw	2	85	4	1	yw	85
分享到:
评论

相关推荐

    MySQL天池训练Task_06

    - `DENSE_RANK()` 和 `RANK()` 函数:这两个函数属于窗口函数,用于在结果集内根据指定的列进行排名。`DENSE_RANK()` 不会跳过相同的值,而`RANK()` 会为相同值分配相同的排名,但后续的排名会有空缺。例如,在第一...

    第18章_MySQL8其它新特性1

    在本章中,我们将学习 MySQL 8 中的窗口函数,包括 RANK()、DENSE_RANK() 和 ROW_NUMBER() 函数,并了解它们在实际应用中的用途。 什么是窗口函数? 窗口函数是一种特殊的函数,它可以对数据进行分区、排序和聚合...

    MySQL使用变量实现各种排序

    在MySQL中,有时候我们需要对数据进行复杂排序,例如实现类似于SQL Server中的`ROW_NUMBER()`, `RANK()`, 和 `DENSE_RANK()`等窗口函数的功能。这些功能在MySQL中可以通过使用用户定义变量来实现,虽然没有内置的...

    mysql.rar_MYSQL

    此外,可能还涉及窗口函数(ROW_NUMBER、RANK、DENSE_RANK等)和集合操作(UNION、INTERSECT、EXCEPT)。 4. **EXISTS子句**: `exists.sql`可能讲解了如何使用EXISTS子句进行查询。EXISTS用于测试子查询是否返回...

    mysql5.7_el7.zip

    另外,增加了窗口函数,如RANK()、DENSE_RANK()和ROW_NUMBER(),这些在数据分析和报表生成中非常实用。 4. 数据库复制改进: MySQL 5.7改进了复制延迟,引入了GTID(全局事务标识符)复制,可以实现无冲突的跨...

    MySQL天池训练营Task_05

    2. `DENSE_RANK()`函数:与`RANK()`类似,但它不会跳过排名,即使有重复的值,也会连续分配排名。 3. `ROW_NUMBER()`函数:为每一行提供一个连续的唯一数字,不管值是否相同。 例如,以下SQL查询将根据产品类型分组...

    HCIP-GaussDB for MySQL题库.docx

    - SQL中的窗口函数,如`ROW_NUMBER()`生成序列,`RANK()`和`DENSE_RANK()`则用于分组内的排序,`NLITE()`可能是输入错误,标准SQL中没有这个函数。 6. **存储过程和函数**: - 存储过程可以使用游标实现动态SQL...

    mysql-8.0.33

    3. **窗口函数**: 新增窗口函数,如`ROW_NUMBER()`, `RANK()`, `DENSE_RANK()`等,增强了数据分析能力。 4. **InnoDB增强**: InnoDB存储引擎的性能和稳定性得到提升,包括更快速的表锁定和更高效的内存使用。 5. *...

    mysql 8.0版本 64位 windows

    - **窗口函数**:MySQL 8.0引入了窗口函数,如ROW_NUMBER(), RANK(), DENSE_RANK()等,允许在结果集上进行复杂的分析操作,无需使用子查询或自连接。 - **JSON增强**:支持JSON数据类型和一系列JSON函数,使MySQL...

    mysql版本收集-mysql8.0.21windows版本

    3. **窗口函数**:此版本引入了更多的窗口函数,如 `RANK()`, `DENSE_RANK()`, `ROW_NUMBER()`, `LEAD()`, 和 `LAG()` 等,这些函数在复杂的数据分析和报表生成中非常有用。 4. **JSON功能增强**:MySQL 8.0 引入了...

    MySQL8.0窗口函数入门实践及总结

    RANK()和DENSE_RANK()与ROW_NUMBER()类似,但它们在遇到相同值时不会跳过排名。RANK()会跳过相同的排名,而DENSE_RANK()则不会。 ```sql -- 使用RANK() SELECT stu_no, course, score, RANK() OVER...

    mysql 5.7安装包文件

    - MySQL 5.7引入了窗口函数,如ROW_NUMBER(), RANK(), DENSE_RANK()等,使复杂分析查询更为便捷。 9. **系统变量和配置**: - 新增了许多系统变量,如`innodb_redo_log_archive`用于控制redo日志归档,以及`...

    mysql-boost-5.7.36.tar.gz

    例如,RANK()、DENSE_RANK()和PERCENT_RANK()等函数可以轻松实现分组和排序,为报表和统计分析提供便利。 MySQL 5.7.36还增强了安全性,包括默认启用的强密码策略、更好的权限管理和审计日志功能。这些特性有助于...

    32-视频33MySQL窗口函数

    - **RANK(),ROW_NUMBER(),DENSE_RANK()**:这三种函数用于为每一行分配一个唯一的排名。RANK()在有并列时会跳过空位,ROW_NUMBER()始终连续,DENSE_RANK()则不跳过并列的排名空位。 - **LEAD(),LAG()**:向前或...

    mysql-connector-java-8.0.27.zip

    3. **窗口函数**:引入了SQL标准的窗口函数,如ROW_NUMBER(),RANK(),DENSE_RANK()等,方便进行复杂的分组计算。 4. **JSON支持**:增强了对JSON数据类型的处理,可以进行JSON文档的索引、查询和更新。 5. **安全...

    最新版windows mysql-8.0.22-winx64

    3. **窗口函数**:MySQL 8.0支持SQL标准的窗口函数,使得在复杂数据集上进行计算和分析变得更加容易,例如ROW_NUMBER()、RANK()、DENSE_RANK()、LEAD()、LAG()等。 4. **JSON增强**:MySQL 8.0增强了对JSON数据类型...

    mysql-5.6.35-winx64.rar

    - **窗口函数**:提供了如ROW_NUMBER(), RANK(), DENSE_RANK()等窗口函数,增强了分析功能。 - **JSON支持**:MySQL 5.6开始支持JSON数据类型,适应NoSQL趋势。 总之,`mysql-5.6.35-winx64.rar`包含了一个强大的...

    Mysql 8.0.15

    2. **窗口函数**:MySQL 8.0 引入了 SQL 标准的窗口函数,如 ROW_NUMBER()、RANK() 和 DENSE_RANK(),这使得在复杂的数据分析和排序场景中编写更简洁的查询。 3. **JSON 函数增强**:MySQL 8.0 提供了更多用于操作 ...

    mysql8安装包msi

    - **窗口函数**:提供了ROW_NUMBER(), RANK(), DENSE_RANK(), LAG(), LEAD()等函数,支持更复杂的查询和分析操作。 - **JSON增强**:增强了对JSON数据类型的处理,包括JSON路径语言、聚合函数JSON_ARRAYAGG和JSON_...

    MYSQL8.0中文参考手册

    - **窗口函数**:MySQL 8.0引入了窗口函数,如RANK(), DENSE_RANK(), ROW_NUMBER(), LAG()和LEAD()等,这使得在复杂查询中进行排序和分组分析变得更加容易。 - **JSON增强功能**:对JSON数据类型的处理得到了增强...

Global site tag (gtag.js) - Google Analytics