在做导出时,遇到一个根据价格最低数统计,所以用到了序号排行,mysql 8.0以上版本支持窗口函数,8.0+可以参看我另一篇文章
一下总结5.7怎么实现一下几种函数:
1、根据分组的结果是每一行记录生成一个序号,每组依次排序且排序的序号不会重复(类似8.0row_number())
2、根据分组的结果会考虑排序字段值相同的情况,若排序字段的值相同则其序号是一样的,后续不同字段值的序号为(前一行序号+N,其中N为前一个字段值重复的行数),比如 1 1 3 4 4 4 7。**(类似8.0rank())
3、根据分组的结果也会考虑排序字段值相同的情况,即排序字段的值相同那么他们的序号是一样的,但是与2****的区别是后续不同字段值的序号为(前一行序号+1),比如 1 1 2 2 3 4 5(类似8.0dense_rank())
根据价格进行序号排行
下面是上面三种情况的实现,需要设置变量
1、第一种情况:
#根据分组的结果是每一行记录生成一个序号,每组依次排序且排序的序号不会重复
SET @row_num = 0; -- 序号
SET @g_id = NULL; -- 设置值-下次比较
-- 1---------------------------
SELECTpurchase_project_material_id as '分组字段', price_after_tax as '排序字段',@row_num := CASE WHEN purchase_project_material_id = @g_id THEN@row_num + 1ELSE1
END as '序号',
@g_id := purchase_project_material_id as '设置下次比较值'
FROMpurchase_project_op_material
WHEREpurchase_project_id = 1875357867884494850 AND type = 1 ORDER BY purchase_project_material_id, price_after_tax;
#执行结果
1、第二种情况:
#根据分组的结果会考虑排序字段值相同的情况,若排序字段的值相同则其序号是一样的,后续不同字段值的序号为(前一行序号+N,其中N为前一个字段值重复的行数),比如 1 1 3 4 4 4 7。**
SET @row_num = 0; -- 序号
SET @g_id = NULL; -- 设置值-下次比较SET @g_price = NULL; -- 设置价格-下次比较-- 2---------------------------
SELECTpurchase_project_material_id as '分组字段', price_after_tax as '排序字段',@row_num := CASE WHEN purchase_project_material_id = @g_id THENCASE WHEN @g_price != price_after_tax THEN@row_num + 1ELSE @row_num ENDELSE1
END as '序号',
@g_id := purchase_project_material_id as '设置下次比较值',
@g_price := price_after_tax as '设置价格-下次比较'
FROMpurchase_project_op_material
WHEREpurchase_project_id = 1875357867884494850 AND type = 1 ORDER BY classify_code,purchase_project_material_id, price_after_tax;
#执行结果
2、第三种情况:
#根据分组的结果也会考虑排序字段值相同的情况,即排序字段的值相同那么他们的序号是一样的,但是与2****的区别是后续不同字段值的序号为(前一行序号+1),比如 1 1 2 2 3 4 5
SET @row_num = 0; -- 序号
SET @g_id = NULL; -- 设置值-下次比较SET @g_price = NULL; -- 设置价格-下次比较SET @index_num = NULL; -- 设置递增的序号
-- 3---------------------------
SELECT@index_num := CASE WHEN purchase_project_material_id = @g_id THEN@index_num + 1ELSE1END as '设置递增的序号', purchase_project_material_id as '分组字段', price_after_tax as '排序字段',@row_num := CASE WHEN purchase_project_material_id = @g_id THENCASE WHEN @g_price != price_after_tax THEN@index_num ELSE @row_num ENDELSE1
END as '序号',
@g_id := purchase_project_material_id as '设置下次比较值',
@g_price := price_after_tax as '设置价格-下次比较'
FROMpurchase_project_op_material
WHEREpurchase_project_id = 1875357867884494850 AND type = 1 ORDER BY purchase_project_material_id, price_after_tax;
#执行结果