mysql分组排序row_number() over(partition by)

drop table if exists tmp1;
create table tmp1 (empid int ,deptid int ,salary decimal(10,2) );
insert into tmp1 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);

select empid,deptid,salary,rank from (

select a.empid,a.deptid,a.salary,@rownum:[email protected]+1 ,
if(@pdept=a.deptid,@rank:[email protected]+1,@rank:=1) as rank,
@pdept:=a.deptid
from

(
select empid,deptid,salary from tmp1 order by deptid asc ,salary asc
) a ,

(select @rownum :=0 , @pdept := null ,@rank:=0) b

) result ;

时间: 2024-10-12 07:58:49

mysql分组排序row_number() over(partition by)的相关文章

MySql 分组排序取时间最大的一条记录

SELECT A.* FROM digital_asset A, (SELECT name, max(last_updated) max_day FROM digital_asset GROUP BY name) B WHERE A.name = B.name AND A.last_updated = B.max_day SELECT A . * FROM bbs_threads A, ( SELECT digest, max( dateline ) max_dateline FROM bbs_

[MySQL] 分组排序取前N条记录以及生成自动数字序列,类似group by后 limit

前言:         同事的业务场景是,按照cid.author分组,再按照id倒叙,取出前2条记录出来.        oracle里面可以通过row_number() OVER (PARTITION BY cid,author ORDER BY id DESC) 表示根据cid,author分组,在分组内部根据id排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的),而mysql数据库就没有这样的统计函数,需要自己写复杂的sql来实现. 1,录入测试数据 USE csd

mysql分组排序取最大值所在行的实现方法

如下图, 计划实现 :按照 parent_code 分组, 取组中code最大值所在的整条记录,如红色部分.(类似hive中: row_number() over(partition by)) select c.* from ( select a.*, (@i := case when @key_i=parent_code then @i+1 else 1 end) as sort_num,(@key_i:=parent_code) as tmp from my_test a, (SELECT

oracle 排序 row_number() over(partition by 排序字段)

业务描述:按t.truckId,t.riskCode 分组,每个分组里有分数,取分组中分数最大的那条记录. 如:A1 B1   5  6 A1  B1   5  3 A1  B2   2  5 A1  B2   2  1 已经按 A,B分组了 但是 我需要第一条和第三条数据,就可以用这个row_number() over(partition by  排序字段)降序 然后取 rowseq = 1 的数据就可以拿到了 SELECT gg.sumScore AS sumScore, gg.number

mysql 分组排序

http://blog.csdn.net/isoleo/article/details/50817976 1.添加行号,b表没实质作用,只是添加行号,(增加一列)的一个操作 select @r:= @r+1 as row_no, pkgname, coefficient, model_idfrom a ,(select @r:=0 ) blimit 10; 2.生成分组序号,MySQL没有row_number(),partition 功能函数,下列语句是按照model_id分组, select

mysql 分组+排序+限定

现在有个有意思的状况,在用户登录成功的时候 ,要显示用户上一次登录的信息,时间和IP等.可是在用户登录信息表中,并不会记录用户的登录过程,只记录的账号密码这些基础信息,用户的操作全部记录在日志表中. 还有,在用户登录成功的时候,会自动想日志表中添加一条记录,在前两天的触发器部分已经解决了这个问题.那么,我们需要做三件事: 1:在log表中找到该用户的所有登录记录 2:按照时间降序排序 3:找到第二行记录,并返回. 为什么是第二行,因为第一行是用户当前登录的信息,第二行才是上次登录的信息. 先创建

MySQL分组排序取前N条记录以及生成自动数字序列--group by 后 limit 外加 rownumber

同事提了一个需求,要求按照某列分组,然后将各组的前几条抽取出来. 表结构 CREATE TABLE `total_freq_ctrl` ( `time` int(10) unsigned NOT NULL, `machine` char(64) NOT NULL, `module` char(32) NOT NULL, `total_flow` int(10) unsigned NOT NULL, `deny_flow` int(10) unsigned NOT NULL, PRIMARY KE

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 i

ROW_NUMBER() OVER()函数用法;(分组,排序),partition by

1.row_number() over()排序功能: (1) row_number() over()分组排序功能: 在使用 row_number() over()函数时候,over()里头的分组以及排序的执行晚于 where group by  order by 的执行. partition by 用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组,它和聚合函数不同的地方在于它能够返回一个分组中的多条记录,而聚合函数一般只有一个反映统计值的记录. 例如:employee,根据部门分组排