基于日期与数量匹配关联两张表的技术需求:计划量匹配聚合交付量
解决表A(计划)与表C(交付)的日期关联问题
我来帮你梳理并落地这个需求!核心逻辑就是先聚合交付量,再按数量匹配关联对应日期,下面分两种常见场景给你具体方案:
场景1:单日交付总量匹配计划量
如果你的需求是「某一天的总交付量刚好等于某条计划的数量」,可以按以下步骤实现:
先明确假设的表结构
- 表A(计划表):
date_plan(计划日期)、Q1(计划数量) - 表C(交付表):
date_deliver(交付日期)、Q2(单条交付的数量)
SQL实现代码
-- 第一步:聚合表C的单日总交付量 WITH aggregated_deliver AS ( SELECT date_deliver, SUM(Q2) AS total_deliver FROM C GROUP BY date_deliver ), -- 第二步:处理同一交付量对应多个日期的情况(这里取最早的交付日期) ranked_deliver AS ( SELECT total_deliver, date_deliver, ROW_NUMBER() OVER (PARTITION BY total_deliver ORDER BY date_deliver ASC) AS rn FROM aggregated_deliver ) -- 第三步:关联计划表与处理后的交付数据 SELECT a.date_plan, a.Q1 AS plan_quantity, rd.date_deliver AS matched_deliver_date, rd.total_deliver AS deliver_quantity FROM A a JOIN ranked_deliver rd ON a.Q1 = rd.total_deliver AND rd.rn = 1; -- 只保留每个交付量对应的第一个日期
代码逻辑说明
aggregated_deliver:把表C按交付日期做汇总,得到每天的总交付量,这样我们能快速定位哪一天的交付总量符合计划数。ranked_deliver:如果存在多个日期的交付总量都等于同一个计划数,用ROW_NUMBER()给这些日期排序,这里默认取最早的(如果要最晚的,把ASC改成DESC就行)。- 最后通过
Q1 = total_deliver匹配数量,就能把对应的交付日期关联到计划上。
场景2:累计交付量达到计划量
如果你的需求是「累计到某一天的交付总量达到/超过计划数量」(比如分批交付、逐步完成计划的场景),需要用累计求和来实现:
SQL实现代码
-- 第一步:计算累计交付量 WITH cumulative_deliver AS ( SELECT date_deliver, SUM(SUM(Q2)) OVER (ORDER BY date_deliver ASC) AS cumulative_total FROM C GROUP BY date_deliver ) -- 第二步:找到每个计划最早完成的交付日期 SELECT a.date_plan, a.Q1 AS plan_quantity, MIN(cd.date_deliver) AS first_reach_date FROM A a JOIN cumulative_deliver cd ON cd.cumulative_total >= a.Q1 GROUP BY a.date_plan, a.Q1;
代码逻辑说明
cumulative_deliver:先按日期汇总单日交付量,再用窗口函数SUM() OVER()计算从最早日期到当前日期的累计交付总量。- 最后通过
cumulative_total >= a.Q1筛选出所有累计量达到计划数的日期,用MIN()取最早的那个日期关联到计划。
额外注意点
- 如果需要严格匹配等于(不是大于等于),把场景2中的
>=改成=即可。 - 如果你的数据库不支持CTE(比如老版本MySQL),可以把CTE替换成子查询,逻辑完全一致。
- 确保两张表的日期字段格式/类型一致,避免因类型不匹配导致关联错误。
内容的提问来源于stack exchange,提问作者TheNoob
相关产品推荐
相关产品推荐

