`

使用mysql实现row_number() over(partition by col1 order by col2)函数

 
阅读更多
row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的


值就表示每组内部排序后的顺序编号(组内连续的唯一的). 

是oracle的函数 我这里有个需求 就是把oracle转换成mysql语句

所以在网上找了一篇 解决方法 答案如下 可用到了用户变量 我晕了 不懂啊


求大虾们给解释啊

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); 
2. 确定需求: 根据部门来分组,显示各员工在部门里按薪水排名名次. 
显示结果预期如下: 
+-------+--------+----------+------+ 
| empid | deptid | salary | rank | 
+-------+--------+----------+------+ 
| 1 | 10 | 5500.00 | 1 |  
| 2 | 10 | 4500.00 | 2 |  
| 4 | 20 | 4800.00 | 1 |  
| 3 | 20 | 1900.00 | 2 |  
| 7 | 40 | 44500.00 | 1 |  
| 6 | 40 | 14500.00 | 2 |  
| 5 | 40 | 6500.00 | 3 |  
| 9 | 50 | 7500.00 | 1 |  
| 8 | 50 | 6500.00 | 2 |  
-----------------------------------------------

做好的sql,SQL 实现 

select empid,deptid,salary,rank from ( 
  select heyf_tmp.empid,heyf_tmp.deptid,heyf_tmp.salary,@rownum:=@rownum+1 , 
  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 @rownum :=0 , @pdept := null ,@rank:=0) a 
) result ; 
结果演示 
+-------+--------+----------+------+ 
| empid | deptid | salary | rank | 
+-------+--------+----------+------+ 
| 1 | 10 | 5500.00 | 1 |  
| 2 | 10 | 4500.00 | 2 |  
| 4 | 20 | 4800.00 | 1 |  
| 3 | 20 | 1900.00 | 2 |  
| 7 | 40 | 44500.00 | 1 |  
| 6 | 40 | 14500.00 | 2 |  
| 5 | 40 | 6500.00 | 3 |  
| 9 | 50 | 7500.00 | 1 |  
| 8 | 50 | 6500.00 | 2 |  
+-------+--------+----------+------+ 
9 rows in set (0.00 sec) 

-------------------------------------------------------
我的问题是
select heyf_tmp.empid,heyf_tmp.deptid,heyf_tmp.salary,@rownum:=@rownum+1 , 
  if(@pdept=heyf_tmp.deptid,@rank:=@rank+1,@rank:=1) as rank, 
  @pdept:=heyf_tmp.deptid 

这sql语句是先从右往左读 还是需哦那个左往右读啊??

是先执行的 @pdept:=heyf_tmp.deptid ,然后是if(@pdept=heyf_tmp.deptid,@rank:=@rank+1,@rank:=1) as rank, 

再后是@rownum:=@rownum+1 ,吗?我理解的对吗??

还有 if(@pdept=heyf_tmp.deptid,@rank:=@rank+1,@rank:=1) 这句是什么意思啊 第一个表达式表达的是

如果@pdept等于heyf_tmp.deptid,然后执行第二个表达式,否则执行第三个表达式吗??


分享到:
评论
3 楼 曾老师 2013-05-30  
chinaway 写道

2 楼 chinaway 2013-04-16  
1 楼 曾老师 2012-09-16  
原来因为不懂这个sql变量 遇到了许多的问题。经过论坛发帖 和大虾的指教 终于找到了答案。

------------------------------
原来的问题是:
说白了 我想问

if(@pdept=heyf_tmp.deptid,@rank:=@rank+1,@rank:=1) as rank, @pdept:=heyf_tmp.deptid  

是先执行后边的一句,还是先执行的前边的一句??

要是从后边开始执行的,怎么执行的呢??每次把部门号 赋值给@pdept ,然后在执行if,

岂不是if第一个表达式参数 不是永远是为true吗?? if参数第一个表达式和后边的 

@pdept:=heyf_tmp.deptid  

是一样啊
----------------------------
得到的解答是

在IF中,@pdept的值为上1条记录中的deptid值,
判断后,重新赋值,为本条记录中的deptid值,
@pdept:=heyf_tmp.deptid  
用于判断下1条记录中的deptid值
----------------------------
是先执行的if 后执行的@pdept:=heyf_tmp.deptid 吗?

第一次执行 @pdept=null 是先 if(null=heyf_tmp.deptid ,,)是吧??

是O~o

相关推荐

    Oracle row_number()over

    row_number() over ([partition by col1] order by col2) as 别名 ``` 其中,`partition by col1` 用于指定分区的列,`order by col2` 用于指定排序的列。 在使用 row_number()over 函数时,需要注意以下几点: * ...

    row_number,根据多个字段过滤,partition by

    本篇文章将围绕如何利用`ROW_NUMBER()`函数结合`PARTITION BY`子句来实现基于多个字段的过滤操作,以解决在给定描述中的问题——即如何根据`name`、`idNumber`以及`date`这三个字段过滤教师表中的重复数据,并仅保留...

    oracle分析函数row_number() over()使用

    Oracle的分析函数row_number() over()是数据库查询中一种强大的工具,它用于对数据集进行分组和排序,尤其在处理重复数据或者实现排名时非常有用。在Oracle SQL中,row_number()函数会为每一行生成一个唯一的数字,...

    ROW_NUMBER() OVER函数的基本用法

    1. 分页:可以使用 ROW_NUMBER() OVER 函数来实现数据库的分页功能。 2. 自动添加字段编号:可以使用 ROW_NUMBER() OVER 函数来自动添加字段编号。 3. 数据分析:可以使用 ROW_NUMBER() OVER 函数来对数据进行分析和...

    SQLServer中Partition By及row_number 函数使用详解

    在SQL Server中,`PARTITION BY` 和 `ROW_NUMBER()` 是两种非常重要的分析函数,它们在处理大数据集时尤其有用。本文将详细讲解这两个函数的使用方法及其在实际场景中的应用。 `PARTITION BY` 关键字是分析函数的一...

    oracle row_number用法

    ROW_NUMBER() OVER (PARTITION BY <column_list> ORDER BY <order_by_expression>) ``` - **PARTITION BY**:用于指定按照哪些列进行分组。 - **ORDER BY**:用于指定如何对分组内的行进行排序。 #### 三、Row_...

    oracle的row_numer()函数的使用

    介绍了 row_number() over(order by column asc) 函数和 row_number() over(partition by column1 order by column2 asc) 的使用实例和方法

    row_number.rar_SQL中row_number用法_number

    SELECT ROW_NUMBER() OVER (ORDER BY column_name(s)) AS row_num, other_columns FROM table_name; ``` 其中,`OVER`子句定义了排序的逻辑窗口,`ORDER BY`子句则指定排序的依据。`column_name(s)`是你想要按照...

    Mssql 增加排序列,分组排序与普通排序 ROW_NUMBER.docx

    `ROW_NUMBER() OVER (PARTITION BY ... ORDER BY ...) AS Seq` - `PARTITION BY` 子句用于将数据集分割成多个分区,每个分区内的行具有相同的值。 - `ORDER BY` 子句则定义了在每个分区内部如何对行进行排序。 2...

    SQL Server中row_number函数的常见用法示例详解

    select *,row_number() over(partition by column1 order by column2) as n from tablename 在上面语法中: PARTITION BY子句将结果集划分为分区。 ROW_NUMBER()函数分别应用于每个分区,并重新初始化每个分区的...

    row_number

    SELECT *, ROW_NUMBER() OVER (PARTITION BY deptid ORDER BY salary DESC) AS rank FROM employee; ``` 这条 SQL 语句的作用是: - 使用 `PARTITION BY deptid` 对数据按照 `deptid` 进行分组。 - 使用 `ORDER BY...

    sqlserver巧用row_number和partition by分组取top数据

    ROW_NUMBER() OVER (PARTITION BY subject ORDER BY score DESC) AS num FROM #score ) T WHERE T.num ORDER BY subject ``` 在这个查询中,`PARTITION BY subject` 将数据按科目分组,`ORDER BY score DESC` 在...

    分析函数ROW_NUMBER、RANK、DENSE_RANK的用法

    ROW_NUMBER() OVER ([<partition_by_clause>] <order_by_clause>) ``` - **PARTITION BY 子句**:用于指定数据集中的分区。如果省略了此子句,则整个结果集被视为一个分区。 - **ORDER BY 子句**:用于确定ROW_...

    RANK OVER()和ROW_NUMBER()OVER的使用

    介绍rank() over()分析函数和 row_number() over 的使用实例及其异同点

    深入探讨:oracle中row_number() over()分析函数用法

    Oracle数据库中的`row_number() over()`分析函数是一个非常实用的工具,用于为数据集中的每一行分配一个唯一的整数,这个数字基于指定的排序条件。在处理大数据集时,它可以帮助我们进行分页、排名或者在复杂的查询...

    oracle中rownum和row_number()

    row_number()over(partition by col1 order by col2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)。 与rownum的区别在于:使用rownum进行排序的...

    ROW_NUMBER SQL Server 2005的LIMIT功能实现(ROW_NUMBER()排序函数)

    ROW_NUMBER() OVER([ <partition_by_clause>] <order_by_clause>) ``` 这里,`<partition_by_clause>` 可以用来将结果集分割成多个分区,每个分区内部的行将独立进行编号。而 `<order_by_clause>` 用于指定在每个...

    SQL中row-number函数用法

    ROW_NUMBER() OVER ( [PARTITION BY partition_expression, ...] ORDER BY order_by_expression [ASC | DESC], ... ) ``` - **PARTITION BY**:可选参数,用于指定分组字段。当指定了这个参数时,`row_number()` 将...

Global site tag (gtag.js) - Google Analytics