`

MYSQL-实现ORACLE 和SQLserver数据中- row_number() over(partition by ) 分组排序功能

 
阅读更多

 网上看见了好多例子都基本上是一样的,没有过多的解释,对于一个初学MySQL来说有点难,我把部分转摘过来如下 原文:http://www.cnblogs.com/buro79xxd/archive/2012/08/29/2662489.html

要求目标:1.确定需求: 根据部门来分组,显示各员工在部门里按薪水排名名次.

创建表格:2.来创建实例数据:

drop table if exists heyf_t10;

create table heyf_t10 (empid int ,deptid int ,salary decimal(10,2) );
insert into heyf_t10 values
(1,10,5500.00),
(2,10,4500.00),
(3,20,1900.00),
(4,20,4800.00),
(5,40,6500.00),
(6,40,14500.00),
(7,40,44500.00),
(8,50,6500.00),

(9,50,7500.00);

数据效果图:

实现 3. http://www.kaishixue.com/mysql/14.html 帖子中SQL的实现

SELECT
empid,
deptid,
salary,
rank
FROM
(
SELECT
heyf_tmp.empid,
heyf_tmp.deptid,
heyf_tmp.salary,

IF (

@pdept = heyf_tmp.deptid ,@rank :=@rank + 1 ,@rank := 1
) AS rank,
@pdept := heyf_tmp.deptid
FROM
(
SELECT
empid,
deptid,
salary
FROM
heyf_t10
ORDER BY
deptid ASC,
salary DESC
) heyf_tmp,
(
SELECT
@pdept := NULL ,@rank := 0
) a
) result;

对于这一段我是羞涩难懂的,虽然实现了需求的结果,看了很久才明白过来,现在我小修改一下 用存储过程实现
 

CREATE PROCEDURE testrank ()
BEGIN
SET @num = 0;
SET @pdept = NULL;
SELECT
result.empid,
result.deptid,
result.salary,
result.rank
FROM
(
SELECT
s.empid,
s.deptid,
s.salary,

IF (
@pdept = s.deptid ,@num :=@num + 1 ,@num := 1
) AS rank,
@pdept := s.deptid
FROM
heyf_t10 s
ORDER BY
s.deptid ASC,
s.salary DESC
) result;

END

执行 语句 call testrank();

结果图:

另外一种思路是上文链接的作者的如下:

SELECT
h.`empid`,
h.`deptid`,
h.`salary`,
count(*) AS rank
FROM
heyf_t10 AS h
LEFT OUTER JOIN heyf_t10 AS r ON h.deptid = r.deptid
AND h.`salary` <= r.`salary`
GROUP BY
h.`empid`,
h.`deptid`,
h.`salary`
ORDER BY
h.deptid,
h.salary DESC;

他们谁好谁差不清楚 反正多了一个思路。这样就是好的。

分享到:
评论

相关推荐

    SQL获取第一条记录的方法(sqlserver、oracle、mysql数据库)

    在SQL中,获取第一条记录的方法通常取决于所使用的数据库系统,如SQL Server、Oracle和MySQL。以下将分别介绍这些数据库系统中获取第一条记录的常用技术。 ### SQL Server 获取第一条记录 在SQL Server中,如果你想...

    .net生成sql分页高性能语句类

    7. **数据库兼容性**:虽然此方法主要适用于SQL Server,但其他数据库系统如Oracle和MySQL也有类似的功能,如`RANK()`、`DENSE_RANK()`等,可以根据不同的数据库系统进行适配。 8. **事务与并发**:在高并发环境下...

    肤浅的SQL分页代码,急需完善

    - ROW_NUMBER():在SQL Server中,可以使用窗口函数`ROW_NUMBER()`配合`OVER`子句进行分页,如`SELECT * FROM (SELECT ..., ROW_NUMBER() OVER(ORDER BY id) AS RowNum) AS T WHERE RowNum BETWEEN (PageNumber - 1...

    sql数据库一些查找删除方法.docx

    在SQL数据库管理中,查找和删除重复数据是一项常见的任务,尤其在大数据量的环境中,保持数据的一致性和准确性至...在实际操作中,应根据具体数据库类型(如MySQL、SQL Server、Oracle等)和数据量大小选择合适的方法。

    超详细Oracle教程.pdf

    - **窗口函数**:介绍OVER子句的使用,包括RANK、ROW_NUMBER等功能强大的窗口函数。 - **集合操作**:学习UNION、INTERSECT、MINUS等集合操作符的应用,用于组合多个查询的结果集。 - **分区函数**:讲解如何使用...

    超详细ORACLE培训带实例带书签目录

    通过一系列章节的学习,读者不仅可以掌握Oracle的基本操作,还能深入了解其架构和高级功能,从而更好地利用Oracle解决实际问题。 #### 第一章 数据库基础 - **数据库概述**:解释什么是数据库,数据库的作用及其...

    session分页,分页,

    为优化性能,可以考虑使用其他策略,如RowNumber函数(MySQL 8.0+,PostgreSQL,SQL Server等支持)或ROW_NUMBER() OVER(PARTITION BY ... ORDER BY ...)(Oracle,SQL Server等支持),结合子查询来实现分页。 在...

    SQL学习

    9. 分区(PARTITION BY)和窗口函数(OVER()):在大型数据集处理时,这些高级功能允许我们在每个分区或行窗口上执行聚合操作,如ROW_NUMBER()、RANK()、DENSE_RANK()等。 10. 视图(VIEW):视图是虚拟表,由SQL...

    SQL面试题SQL面试题SQL面试题

    SELECT year, amount, ROW_NUMBER() OVER(PARTITION BY year ORDER BY month) AS rn FROM aaa ) subquery GROUP BY year ``` 这些查询将数据转换为指定的格式,每个年份对应4个月份的金额,使用了`CASE WHEN`...

    存储过程分页和ASP.NET后台代码

    2. **ROW_NUMBER()函数**:在SQL Server中,ROW_NUMBER()函数可以为查询结果集中的每一行生成一个唯一的行号,这是实现分页的关键。通常,我们会结合OVER子句和PARTITION BY来设定行号的生成规则。 3. **OFFSET-...

    Oracle数据库中SQL开窗函数的使用

    开窗函数是SQL语言中的一个重要特性,它极大地增强了SQL的计算能力,特别是在处理复杂的排序、分组和统计问题时。开窗函数的概念起源于2003年ISO SQL标准,目的是解决传统SQL难以处理的复杂查询场景。Oracle、SQL ...

    hibernate中实现真分页和假分页技术

    真分页主要依赖于SQL的`LIMIT`和`OFFSET`子句(MySQL、PostgreSQL等数据库)或者`ROW_NUMBER() OVER(PARTITION BY ... ORDER BY ...)`(Oracle、SQL Server等)。然而,Hibernate原生并不直接支持这些特性,我们需要...

    随机抽取的sql语句 每班任意抽取3名学生

    总结来说,这个SQL语句通过`ROW_NUMBER()`函数和随机化排序实现了按班级随机抽取学生的功能。在实际应用中,可能需要根据数据库管理系统(如MySQL、PostgreSQL、Oracle等)的特性稍作调整,因为不同数据库对随机数...

    SQL语法教程

    3. 分区(PARTITION BY)和窗口函数:在聚合函数中,`OVER()`配合`PARTITION BY`可以对数据进行分区处理,窗口函数如`RANK()`, `ROW_NUMBER()`, `LEAD()`, `LAG()`等提供了更复杂的分析能力。 4. 视图(VIEW):...

    sql数据库基础知识整理,常用函数及常用语法

    例如,`ROW_NUMBER() OVER (PARTITION BY 分组字段 ORDER BY 排序字段)`会根据分组字段和排序字段生成行号。`CASE`语句则用于条件判断,`UNION`用于合并两个查询的结果,`UNION ALL`则包含所有结果,包括重复项。 ...

    sql删除重复数据的详细方法

    select *, ROW_NUMBER() OVER(PARTITION BY c1, c2, c3 ORDER BY (getdate())) as num from duplicate_all where c1 = 1 ) delete tmp where num &gt; 1 ``` **二、删除部分重复的记录** 部分字段值重复的记录...

    创智和宇.docx(某公司的校招题目)

    - 分页查询通常使用`LIMIT`和`OFFSET`(MySQL语法)或者`ROW_NUMBER() OVER(PARTITION BY ... ORDER BY ...)`(Oracle、SQL Server等)。对于Oracle,可以使用子查询结合`ROWNUM`实现分页。例如: ```sql SELECT ...

    开窗函数有浅入深详解(一)

    开窗函数在MSSQL Server、Oracle、DB2等主流数据库系统中得到广泛支持,但遗憾的是,MySQL当前版本还不支持。 首先,我们需要理解什么是窗口。在SQL中,"窗口"是指在执行开窗函数时定义的一组行,这组行是相对于...

    SQL开窗函数的具体实现详解

    在2003年的ISO SQL标准中引入了开窗函数,随后被MSSQL Server、Oracle、DB2等主流数据库系统支持,但遗憾的是,MySQL目前还不支持。 开窗函数的核心在于定义一个“窗口”,这个窗口可以随着查询中的每一行变化,...

Global site tag (gtag.js) - Google Analytics