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

 

posted @ 2018-09-04 14:23  夏侯胖墩  阅读(451)  评论(0编辑  收藏  举报