mysql8窗口函数(一)
NO.1 row_number() #返回分区内的当前行数。行数范围从1到分区行数。
row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)
以下是测试表格,订单信息表,包含订单号,用户id,金额,创建时间字段。
create table order_info ( order_id int primary key, user_no varchar(10), amount int, create_date datetime ); insert into order_info values (1,'u0001',100,'2018-1-1'); insert into order_info values (2,'u0001',300,'2018-1-2'); insert into order_info values (3,'u0001',300,'2018-1-2'); insert into order_info values (4,'u0001',800,'2018-1-10'); insert into order_info values (5,'u0001',900,'2018-1-20'); insert into order_info values (6,'u0002',500,'2018-1-5'); insert into order_info values (7,'u0002',600,'2018-1-6'); insert into order_info values (8,'u0002',300,'2018-1-10'); insert into order_info values (9,'u0002',800,'2018-1-16'); insert into order_info values (10,'u0002',800,'2018-1-22');
需求1:查询求每个用户的订单,每个用户的订单,记录按最近日期从1开始编号
select row_number()over(partition by user_no order by create_date desc) as row_num, order_id,user_no,amount,create_date from order_info;
以下为查询结果:
需求2: 查询求每个用户的最新的一个订单。
思路,以需求1的结果为基础数据,查询编号为1的记录即可。
select * from ( select row_number()over(partition by user_no order by create_date desc) as row_no, order_id,user_no,amount,create_date from order_info )t where row_no=1;
查询结果如下:
row_number()函数可以按照分组排序,在组内形成编号,但是可能会出现两组相同数据一致的情况,如排序字段内容相同时应该是行号并列。
此时可以使用rank()
rank()
与row_number()函数相似,但是同辈被分配相同的行号,如此,遇到相同的列则会出现效果 1,2,2,4,5...
出现跳号。
如果不想跳号则可用dense_rank()代替。效果为1,2,2,3,4...
参考自https://www.cnblogs.com/wy123/archive/2018/03/14/8570011.html