You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Access中使用Min/Max函数时如何处理年份间隔问题?

解决汽车零部件连续年份区间分组问题

这个问题我太熟悉了——很多处理时间序列数据的场景都会遇到,尤其是这种有中断的连续区间分组需求。我给你一步步拆解解决方案:

首先先明确你的数据情况:

原始数据

YearMakeModelPartNo
2001ToyotaCorolla8675309
2002ToyotaCorolla8675309
2004ToyotaCorolla8675309
2005ToyotaCorolla8675309

错误结果(直接用Min/Max分组)

YearsMakeModelPartNo
2001-2005ToyotaCorolla8675309

期望正确结果

YearsMakeModelPartNo
2001-2002ToyotaCorolla8675309
2004-2005ToyotaCorolla8675309

核心思路:识别连续年份的分组标识

问题的关键是把同一零件(Make/Model/PartNo)下的连续年份归为同一组,中断的年份单独成组。我们可以用窗口函数来实现这个逻辑:

步骤1:生成分组标识

对每个Make, Model, PartNo分组内的年份按升序排序,然后计算Year - ROW_NUMBER()的值——连续的年份这个值会保持一致,中断的年份会产生新的分组标识:

SELECT 
    Year,
    Make,
    Model,
    PartNo,
    Year - ROW_NUMBER() OVER (PARTITION BY Make, Model, PartNo ORDER BY Year) AS group_id
FROM your_table_name;

执行后会得到这样的中间结果:

YearMakeModelPartNogroup_id
2001ToyotaCorolla86753092000
2002ToyotaCorolla86753092000
2004ToyotaCorolla86753092002
2005ToyotaCorolla86753092002

可以看到,连续年份的group_id完全相同,这就是我们分组的依据。

步骤2:聚合生成年份区间

接下来按Make, Model, PartNo, group_id分组,用MIN(Year)和MAX(Year)拼接成区间字符串:

SELECT 
    CONCAT(MIN(Year), '-', MAX(Year)) AS Years,
    Make,
    Model,
    PartNo
FROM (
    SELECT 
        Year,
        Make,
        Model,
        PartNo,
        Year - ROW_NUMBER() OVER (PARTITION BY Make, Model, PartNo ORDER BY Year) AS group_id
    FROM your_table_name
) AS grouped_data
GROUP BY Make, Model, PartNo, group_id
ORDER BY Make, Model, PartNo, MIN(Year);

执行这段代码后,就能得到你想要的正确结果。


兼容旧版数据库的方案

如果你的数据库不支持窗口函数(比如MySQL 5.x及更早版本),可以用变量模拟分组标识:

SELECT 
    CONCAT(MIN(Year), '-', MAX(Year)) AS Years,
    Make,
    Model,
    PartNo
FROM (
    SELECT 
        Year,
        Make,
        Model,
        PartNo,
        @group_id := IF(@prev_part = CONCAT(Make, Model, PartNo) AND Year = @prev_year + 1, @group_id, @group_id + 1) AS group_id,
        @prev_part := CONCAT(Make, Model, PartNo),
        @prev_year := Year
    FROM your_table_name, (SELECT @group_id := 0, @prev_part := '', @prev_year := 0) AS init_vars
    ORDER BY Make, Model, PartNo, Year
) AS grouped_data
GROUP BY Make, Model, PartNo, group_id
ORDER BY Make, Model, PartNo, MIN(Year);

内容的提问来源于stack exchange,提问作者EzGoingKev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:09:21