参考
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
分享到:
相关推荐
- `DENSE_RANK()` 和 `RANK()` 函数:这两个函数属于窗口函数,用于在结果集内根据指定的列进行排名。`DENSE_RANK()` 不会跳过相同的值,而`RANK()` 会为相同值分配相同的排名,但后续的排名会有空缺。例如,在第一...
在本章中,我们将学习 MySQL 8 中的窗口函数,包括 RANK()、DENSE_RANK() 和 ROW_NUMBER() 函数,并了解它们在实际应用中的用途。 什么是窗口函数? 窗口函数是一种特殊的函数,它可以对数据进行分区、排序和聚合...
在MySQL中,有时候我们需要对数据进行复杂排序,例如实现类似于SQL Server中的`ROW_NUMBER()`, `RANK()`, 和 `DENSE_RANK()`等窗口函数的功能。这些功能在MySQL中可以通过使用用户定义变量来实现,虽然没有内置的...
此外,可能还涉及窗口函数(ROW_NUMBER、RANK、DENSE_RANK等)和集合操作(UNION、INTERSECT、EXCEPT)。 4. **EXISTS子句**: `exists.sql`可能讲解了如何使用EXISTS子句进行查询。EXISTS用于测试子查询是否返回...
另外,增加了窗口函数,如RANK()、DENSE_RANK()和ROW_NUMBER(),这些在数据分析和报表生成中非常实用。 4. 数据库复制改进: MySQL 5.7改进了复制延迟,引入了GTID(全局事务标识符)复制,可以实现无冲突的跨...
2. `DENSE_RANK()`函数:与`RANK()`类似,但它不会跳过排名,即使有重复的值,也会连续分配排名。 3. `ROW_NUMBER()`函数:为每一行提供一个连续的唯一数字,不管值是否相同。 例如,以下SQL查询将根据产品类型分组...
- MySQL 8.0 添加了窗口函数,如RANK()、DENSE_RANK()和ROW_NUMBER(),使得复杂的数据分析和排序变得更加便捷。 5. **JSON支持**: - 提供了对JSON数据类型的原生支持,可以方便地处理非结构化数据,同时支持JSON...
- SQL中的窗口函数,如`ROW_NUMBER()`生成序列,`RANK()`和`DENSE_RANK()`则用于分组内的排序,`NLITE()`可能是输入错误,标准SQL中没有这个函数。 6. **存储过程和函数**: - 存储过程可以使用游标实现动态SQL...
3. **窗口函数**: 新增窗口函数,如`ROW_NUMBER()`, `RANK()`, `DENSE_RANK()`等,增强了数据分析能力。 4. **InnoDB增强**: InnoDB存储引擎的性能和稳定性得到提升,包括更快速的表锁定和更高效的内存使用。 5. *...
- **窗口函数**:MySQL 8.0引入了窗口函数,如ROW_NUMBER(), RANK(), DENSE_RANK()等,允许在结果集上进行复杂的分析操作,无需使用子查询或自连接。 - **JSON增强**:支持JSON数据类型和一系列JSON函数,使MySQL...
3. **窗口函数**:此版本引入了更多的窗口函数,如 `RANK()`, `DENSE_RANK()`, `ROW_NUMBER()`, `LEAD()`, 和 `LAG()` 等,这些函数在复杂的数据分析和报表生成中非常有用。 4. **JSON功能增强**:MySQL 8.0 引入了...
RANK()和DENSE_RANK()与ROW_NUMBER()类似,但它们在遇到相同值时不会跳过排名。RANK()会跳过相同的排名,而DENSE_RANK()则不会。 ```sql -- 使用RANK() SELECT stu_no, course, score, RANK() OVER...
- MySQL 5.7引入了窗口函数,如ROW_NUMBER(), RANK(), DENSE_RANK()等,使复杂分析查询更为便捷。 9. **系统变量和配置**: - 新增了许多系统变量,如`innodb_redo_log_archive`用于控制redo日志归档,以及`...
例如,RANK()、DENSE_RANK()和PERCENT_RANK()等函数可以轻松实现分组和排序,为报表和统计分析提供便利。 MySQL 5.7.36还增强了安全性,包括默认启用的强密码策略、更好的权限管理和审计日志功能。这些特性有助于...
3. **窗口函数**:引入了SQL标准的窗口函数,如ROW_NUMBER(),RANK(),DENSE_RANK()等,方便进行复杂的分组计算。 4. **JSON支持**:增强了对JSON数据类型的处理,可以进行JSON文档的索引、查询和更新。 5. **安全...
- **RANK(),ROW_NUMBER(),DENSE_RANK()**:这三种函数用于为每一行分配一个唯一的排名。RANK()在有并列时会跳过空位,ROW_NUMBER()始终连续,DENSE_RANK()则不跳过并列的排名空位。 - **LEAD(),LAG()**:向前或...
3. **窗口函数**:MySQL 8.0支持SQL标准的窗口函数,使得在复杂数据集上进行计算和分析变得更加容易,例如ROW_NUMBER()、RANK()、DENSE_RANK()、LEAD()、LAG()等。 4. **JSON增强**:MySQL 8.0增强了对JSON数据类型...
- **窗口函数**:提供了如ROW_NUMBER(), RANK(), DENSE_RANK()等窗口函数,增强了分析功能。 - **JSON支持**:MySQL 5.6开始支持JSON数据类型,适应NoSQL趋势。 总之,`mysql-5.6.35-winx64.rar`包含了一个强大的...
- **窗口函数**:MySQL 8.0引入了窗口函数,如RANK(), DENSE_RANK(), ROW_NUMBER(), LAG()和LEAD()等,这使得在复杂查询中进行排序和分组分析变得更加容易。 - **JSON增强功能**:对JSON数据类型的处理得到了增强...
2. **窗口函数**:MySQL 8.0 引入了 SQL 标准的窗口函数,如 ROW_NUMBER()、RANK() 和 DENSE_RANK(),这使得在复杂的数据分析和排序场景中编写更简洁的查询。 3. **JSON 函数增强**:MySQL 8.0 提供了更多用于操作 ...