使用Index Match按日期范围匹配销售记录对应更新价格
按生效日期匹配销售记录对应定价的实现方案
核心匹配逻辑非常明确:销售记录的购买日期落在定价规则的生效起止日期闭区间内,即为该笔销售对应的当期适用价格,完全符合你给出的第一笔1100$、第二笔1200$的预期匹配结果。
以下是不同技术栈下可直接落地的实现方式:
1. SQL 实现(业务库/数仓查询场景)
提前把两个表的日期字段统一转为DATE类型,剔除时分秒避免精度导致的匹配错误,直接做区间关联即可:
SELECT s.CustomerID, s.Country, s.`date of purchase`, p.price AS applicable_price FROM 销售记录表 s LEFT JOIN 价格规则表 p ON s.`date of purchase` BETWEEN p.effective_start AND p.effective_end;
异常场景处理:如果价格规则表存在日期区间重叠的配置(比如同一天配了两个价格),会出现一笔销售匹配多条价格的问题,这时候加窗口函数取最新生效的规则即可:
WITH rule_unique AS ( SELECT price, effective_start, effective_end, ROW_NUMBER() OVER(ORDER BY effective_start DESC) AS rn FROM 价格规则表 ) SELECT s.CustomerID, s.Country, s.`date of purchase`, p.price AS applicable_price FROM 销售记录表 s LEFT JOIN rule_unique p ON s.`date of purchase` BETWEEN p.effective_start AND p.effective_end WHERE p.rn = 1;
2. Python Pandas 实现(离线数据处理场景)
处理本地Excel/CSV批量数据时,用merge_asof做近似匹配性能远高于普通笛卡尔积关联,代码如下:
import pandas as pd # 读取本地数据,替换成实际文件路径 sales_df = pd.read_excel("销售记录表.xlsx") price_rule_df = pd.read_excel("价格规则表.xlsx") # 统一日期格式 sales_df["purchase_date"] = pd.to_datetime(sales_df["date of purchase"]) price_rule_df["effective_start"] = pd.to_datetime(price_rule_df["生效起始日期列"]) price_rule_df["effective_end"] = pd.to_datetime(price_rule_df["生效截止日期列"]) # 按日期排序后做向后匹配 sales_df = sales_df.sort_values("purchase_date") price_rule_df = price_rule_df.sort_values("effective_start") match_result = pd.merge_asof( sales_df, price_rule_df, left_on="purchase_date", right_on="effective_start", direction="backward" ) # 过滤掉超出截止日期的无效匹配 match_result = match_result[match_result["purchase_date"] <= match_result["effective_end"]]
3. Excel 函数实现(小批量手工处理场景)
不需要写代码,直接用LOOKUP函数就能完成匹配:
假设销售表中购买日期存在C列,价格规则表的生效起始日期在Sheet2的A列、生效截止在B列、对应价格在C列,在销售表D2单元格输入以下公式后下拉填充即可:
=LOOKUP(1,0/((C2>=Sheet2!$A$2:$A$100)*(C2<=Sheet2!$B$2:$B$100)),Sheet2!$C$2:$C$100)
示例表参考


内容的提问来源于stack exchange,提问作者Yuval
相关产品推荐
相关产品推荐

