MySQL查询:按最大有效日期获取各unit_code的唯一对应数据行
MySQL 按unit_code取最新有效生效记录的查询实现
常见结果偏差的核心原因
大部分查询得不到预期结果,基本是踩到两个典型问题:
- 计算最大生效时间时,没有提前过滤
effective_from > 当前日期的未来记录,导致把未生效的未来数据当成了最大值 - 关联原表取金额时,只按unit_code关联,没有匹配对应的生效时间值,错取到同unit_code下其他历史时间的金额
实现方案1:MySQL 8.0及以上版本(窗口函数方案,性能更优)
- 逻辑说明:对过滤后的有效记录,按unit_code分组、生效时间降序排序,直接取每组的第一条记录即可
- 注意:执行时请将代码里的
your_business_table替换为实际业务表名 - 参考SQL代码:
WITH filtered_valid_data AS ( SELECT unit_code, amount, effective_from, ROW_NUMBER() OVER ( PARTITION BY unit_code ORDER BY effective_from DESC ) AS row_rank FROM your_business_table WHERE effective_from <= CURDATE() ) SELECT unit_code, amount, effective_from FROM filtered_valid_data WHERE row_rank = 1;
- 适配提示:如果同一unit_code下存在多条完全相同的最大生效时间记录,且需要全部返回时,可将
ROW_NUMBER()替换为RANK()
实现方案2:MySQL 5.x低版本兼容方案(无窗口函数)
- 逻辑说明:先聚合算出每个unit_code符合日期要求的最大生效时间,再回连原表匹配对应记录
- 注意:执行时请将代码里的
your_business_table替换为实际业务表名 - 参考SQL代码:
SELECT main.unit_code, main.amount, main.effective_from FROM your_business_table main INNER JOIN ( SELECT unit_code, MAX(effective_from) AS latest_valid_date FROM your_business_table WHERE effective_from <= CURDATE() GROUP BY unit_code ) latest ON main.unit_code = latest.unit_code AND main.effective_from = latest.latest_valid_date;
内容的提问来源于stack exchange,提问作者Albert Alberto
相关产品推荐
相关产品推荐

