`

使用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_numer()函数的使用

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

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

    partition by关键字是分析性函数的一部分,partition by用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组,本文给大家介绍SQLServer中Partition By及row_number 函数使用详解,需要的朋友参考下

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

    过滤方法有distinct 获取是整行 重复 但只想过滤2个或2个以上不是所有字段 怎么办? 根据多个字段过滤 比如表:teacher表 id ,name ,sex,idNumber,phone,date; 需求 根据name和idnumber和date过滤重复数据只取...

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

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

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

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

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

    SQL Server 2005后之后,引入了row_number()函数,row_number()函数的分组排序功能使这种操作变得非常简单。下面是一个简单示例: 代码如下: –1.创建测试表 create table #score ( name varchar(20), subject ...

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

    语法: ROW_NUMBER() OVER([ <partition>] <order>) 备注: ORDER BY子句可确定在特定分区中为行分配唯一ROW_NUMBER的顺序。 参数: <partition> 将FROM子句生成的结果集划入应用了ROW_NUMBER函数的分区。 <order> ...

    SQLSERVER 2005的ROW_NUMBER、RANK、DENSE_RANK的用法

    语法:ROW_NUMBER () OVER ( [ <partition> ] <order> ) 。备注:ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。参数:<partition> :将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区...

    sql利用row_number()取唯一记录方法

    row_number() over(partition by A order by B desc)

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

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

    over函数的使用

    Select * from (select name,class,s,rank() over(partition by class order by s desc) mm from t2) where mm=1; 说明: 1.在求第一名成绩的时候,不能用row_number(),因为如果同班有2个并列第1,row_number()只...

    sqlserver2005使用row_number() over分页的实现方法

    OVER(PARTITION BY COLUMN ORDER BY COLUMN) <BR> 例子: 代码如下: select * from ( select *, ROW_NUMBER() OVER(Order by a.CreateTime DESC ) AS RowNumber from table_name as a ) as b where RowNumber BETWEEN...

    SQL中的ROW NUMBER() OVER()

    原始数据展示 一:SQL展示 select id,name,age,salary,row_number()over(order by ...select id,name,age,salary,row_number()over(partition by id order by salary desc) rkfrom TEST_ROW_NUMBER_OVER tSQL语句后

    SQL Server中row_number分页查询的用法详解

    ROW_NUMBER()函数将针对SELECT语句返回的每一行,从1...语法:ROW_NUMBER () OVER ([ <partition> ] <order>) 。 备注:ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。 参数:<partition_by_cl

    oracle函数介绍(6) 著名函数之分析函数.doc

    SELECT col, AVG(value) OVER(PARTITION BY col ORDER BY col) FROM tmp1 ORDER BY col; 2、SUM ( [ DISTINCT | ALL ] expr ) OVER ( analytic_clause ) 例如: --聚合函数 SELECT col, sum(value) FROM tmp1 ...

    oracle中rownum和row_number()

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

    ORACLE 常用分析函数

     ROW_NUMBER () OVER([partition_clause] order_by_clause) dense_rank在做排序时如果遇到列有重复值,则重复值所在行的序列值相同,而其后的序列值依旧递增,rank则是重复值所在行的序列值相同,但其后的序列值从...

    oracle常用分析函数与聚合函数的用法

    今天是2019年第一天,在此祝大家新年快乐,梦想还在路上,让我们...rownumber ( ) over ( [partition by col] order by col ) rank() 是排名的函数,该函数组内排序后会进行跳号,分数相同的作为并列。 dense_rank()

Global site tag (gtag.js) - Google Analytics