mysql partition by的实现

Mysql 8.0之前是不支持 partition by 语法的。但有类似的解决方案。我们先通过一个实例来说明。

实例

**1:**下图所示,一个零件编号有多个价格。需要筛选出 零件最新的价格。 (需要找出 PRICE_VALID_FROM最近的那条数据)。

在这里插入图片描述

2: SQL语句

SELECT MATERIAL,  VENDOR_NAME_ZH,
SUBSTRING_INDEX( GROUP_CONCAT(NET_PRICE order by PRICE_VAILD_FROM desc) ,',',1) NET_PRICE 
from t_swcas_db_part 
where  MATERIAL like '100000035-002%'and
  IS_ENABLE='1' 
and  PRICE_VAILD_FROM <= SYSDATE() and PRICE_VAILD_TO >= SYSDATE()
group by MATERIAL, VENDOR_NAME_ZH
order by material limit 10

在这里插入图片描述

关键

 SUBSTRING_INDEX( GROUP_CONCAT(NET_PRICE order by PRICE_VAILD_FROM desc) ,',',1) NET_PRICE 

这段代码分成两步部分
1:GROUP_CONCAT(NET_PRICE order by PRICE_VAILD_FROM desc)
根据 PRICE_VAILD_FROM 字段倒序排序后,把 NET_PRICE 通过“,”分隔开输出。

2:SUBSTRING_INDEX
字符串截取第一个值。

下面把过程也输出来,一目了然
在这里插入图片描述

ps:我这里因为只需要获取价格,所以只输出价格,如果需要获取整行数据的话,可以获取ID,后续再根据ID去关联。

### MySQL 中 `PARTITION BY` 的替代方法及其有效使用 #### 使用窗口函数实现分区功能 自 MySQL 8.0 版本起引入了窗口函数,这使得无需依赖物理表分区即可实现逻辑上的数据分组操作。通过 OVER 子句中的 PARTITION BY 可以轻松完成类似于传统 SQL 分区的功能。 ```sql SELECT department, employee_name, salary, AVG(salary) OVER(PARTITION BY department) as avg_salary_per_dept FROM employees; ``` 此查询会计算每个部门内员工工资的平均值[^1]。 #### 利用子查询模拟分区效果 对于较早版本的 MySQL 或者特定场景下不适用窗口函数的情况,则可以考虑采用子查询的方式来达到相同目的: ```sql SELECT e.department, e.employee_name, e.salary, d.avg_salary AS dept_avg_salary FROM employees e JOIN ( SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department ) d ON e.department = d.department; ``` 这种方法虽然效率可能不如窗口函数高,但在某些情况下仍然非常有用[^2]。 #### 创建临时表或视图来处理复杂的数据集划分需求 当面对更复杂的业务逻辑时,创建专门用于存储中间结果的临时表或是定义视图也是一种不错的选择。这样不仅可以简化最终查询语句,还能提高性能表现。 ```sql CREATE TEMPORARY TABLE temp_employee_stats AS SELECT department, COUNT(*) emp_count, SUM(salary) total_salaries FROM employees GROUP BY department; -- 后续可以直接基于这个临时表做进一步分析 ``` 以上几种方式都可以作为 MySQL 中 `PARTITION BY` 功能的有效补充,在不同应用场景中有各自的优势和局限性[^3]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值