在做导出时,遇到一个根据价格最低数统计,所以用到了序号排行,数据库用的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()使用
SELECTclassify_code as '材料code', price_after_tax as '价格排名列',row_number() OVER ( PARTITION BY classify_code ORDER BY classify_code, price_after_tax ) AS '排行序号' FROMpurchase_project_op_material WHEREpurchase_project_id = 1878637071744167937 AND type = 1
#执行结果:
#rank() over()使用
SELECTclassify_code as '材料code', price_after_tax as '价格排名列',rank() OVER ( PARTITION BY classify_code ORDER BY classify_code, price_after_tax ) AS '排行序号' FROMpurchase_project_op_material WHEREpurchase_project_id = 1878637071744167937 AND type = 1
#执行结果
#dense_rank() over()使用
SELECTclassify_code as '材料code', price_after_tax as '价格排名列',dense_rank() OVER ( PARTITION BY classify_code ORDER BY classify_code, price_after_tax ) AS '排行序号' FROMpurchase_project_op_material WHEREpurchase_project_id = 1878637071744167937 AND type = 1
#执行结果
最后注意:
over(partition by字段1 order by 字段2)中的partition by 字段1 是可以省略的但是order by 字段2 不可省略