mysql窗口函数rank() over、dense_rank() over、row_number() over 实现分组排行

在做导出时,遇到一个根据价格最低数统计,所以用到了序号排行,数据库用的8.0.33;

正好mysql 8.0以上版本支持窗口函数

总结一下几种函数:

1、row_number()

row_number()over(partition by字段1 order by 字段2) 的结果是每一行记录生成一个序号,依次排序且排序的序号不会重复

2、rank()

rank()over(partition by字段1 order by 字段2) 的结果会考虑排序字段值相同的情况,若排序字段的值相同则其序号是一样的,后续不同字段值的序号为(前一行序号+N,其中N为前一个字段值重复的行数),比如 1 1 3 4 4 4 7。**

3、dense_rank()

dense_rank()over(partition by字段1 order by 字段2) 的结果也会考虑排序字段值相同的情况,即排序字段的值相同那么他们的序号是一样的,但是与rank()****的区别是后续不同字段值的序号为(前一行序号+1),比如 1 1 2 2 3 4 5

根据价格进行序号排行

#row_number() over()使用

	SELECT
		classify_code as '材料code', price_after_tax as '价格排名列',
		row_number() OVER ( PARTITION BY classify_code ORDER BY classify_code, price_after_tax ) AS '排行序号' 
	FROM
		purchase_project_op_material 
	WHERE
		purchase_project_id = 1878637071744167937 
		AND type = 1 

#执行结果:

#rank() over()使用


	SELECT
		classify_code as '材料code', price_after_tax as '价格排名列',
		rank() OVER ( PARTITION BY classify_code ORDER BY classify_code, price_after_tax ) AS '排行序号' 
	FROM
		purchase_project_op_material 
	WHERE
		purchase_project_id = 1878637071744167937 
		AND type = 1 

#执行结果

#dense_rank() over()使用


	SELECT
		classify_code as '材料code', price_after_tax as '价格排名列',
		dense_rank() OVER ( PARTITION BY classify_code ORDER BY classify_code, price_after_tax ) AS '排行序号' 
	FROM
		purchase_project_op_material 
	WHERE
		purchase_project_id = 1878637071744167937 
		AND type = 1 

#执行结果

最后注意:

over(partition by字段1 order by 字段2)中的partition by 字段1 是可以省略的但是order by 字段2 不可省略

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值