mysql5.7+实现分组排行实现分组排行,自动序列,分组求最值

devtools/2025/1/16 13:59:12/

在做导出时,遇到一个根据价格最低数统计,所以用到了序号排行,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;

 #执行结果

如果有更好的办法欢迎留言评论,如果是8.0+mysql数据库,请参考另外一篇文章,更简单


http://www.ppmy.cn/devtools/150970.html

相关文章

django在线考试系统

Django在线考试系统是一种基于Django框架开发的在线考试平台,它提供了完整的在线考试解决方案。 一、系统概述 Django在线考试系统旨在为用户提供便捷、高效的在线考试环境,满足教育机构、企业、个人等不同场景下的考试需求。通过该系统,用…

504 Gateway Timeout:网关超时解决方法

一、什么是 504Gateway Timeout? 1. 错误定义 504 Gateway Timeout 是 HTTP 状态码的一种,表示网关或代理服务器在等待上游服务器响应时超时。通俗来说,这是服务器之间“对话失败”导致的。 2. 常见触发场景 Nginx 超时:反向代…

72_List列表原理

1.List列表介绍 在Redis的List数据类型中,元素以字符串形式存在,并按照它们被插入的顺序进行有序排列。List允许元素重复,即相同元素可以被多次添加到列表中。每个List的容量上限为2的32次方减1,,也就是4294967295个元素。我们可以添加一个新元素到List列表的头部(左边)…

Plyr 在 vue3 中的使用

1. 安装 Plyr pnpm add plyr 2. 引入 Plyr 在需要使用 Plyr 的 Vue 组件中&#xff0c;引入 Plyr 的 CSS 和 JavaScript 文件。 import "plyr/dist/plyr.css";import Plyr from "plyr"; 3. 在模板中使用 Plyr 在 Vue 组件的<template>中&#…

链家房价数据爬虫和机器学习数据可视化预测

完整源码项目包获取→点击文章末尾名片&#xff01;

征服Windows版nginx(2)

1.配置Nginx 编辑Nginx的配置文件&#xff08;通常是nginx.conf&#xff09;&#xff0c;找到安装Nginx位置&#xff0c;如下路径&#xff1a; D:\nginx-1.26.2\conf 双击打开nginx.CONF编辑&#xff0c;在http块中添加一个新的server块&#xff0c;用于指定Vue项目的静态文件…

【C++】PP5015 [NOIP2018 普及组] 标题统计

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示数据规模与约定 &#x1f4af;方法分析方法1&#xff1a;我的做法实…

Type-C双屏显示器方案

在数字化时代&#xff0c;高效的信息处理和视觉体验已成为我们日常生活和工作的关键需求。随着科技的进步&#xff0c;一款结合了便携性和高效视觉输出的设备——双屏便携屏&#xff0c;逐渐崭露头角&#xff0c;成为追求高效工作和娱乐体验人群的新宠。本文将深入探讨双屏便携…