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

Snowflake关联带生效日期表时旧记录返回NULL的解决方法咨询

Snowflake SQL 生效商品数量关联问题修复

原SQL错误原因

原有逻辑是先对每个商品取全局最新的生效记录,再关联发票日期<=该生效日期的记录,会触发两个问题:

  • 2021-02-01的发票日期早于商品100的全局最新生效日期2021-09-01,错误匹配到数量5
  • 2021-09-10的发票日期晚于全局最新生效日期2021-09-01,无法匹配出现NULL值

修复方案

方案1:通用SQL写法(兼容所有支持窗口函数的数据库)

将行号过滤逻辑放在关联之后,按发票日期+商品分组,取小于等于发票日期的最大生效日期对应的记录即可:

SELECT * FROM REPORT t1
LEFT JOIN ITEM t2 
  ON t1.ITEM = t2.ITEM 
  AND t2.EFFECTIVE_DATE <= t1.INVOICE_DATE
QUALIFY ROW_NUMBER() OVER (
  PARTITION BY t1.INVOICE_DATE, t1.ITEM 
  ORDER BY t2.EFFECTIVE_DATE DESC
) = 1;

方案2:Snowflake专属ASOF JOIN写法(性能更优)

Snowflake原生支持ASOF JOIN用于时间维度的近似匹配,自动匹配小于等于目标值的最大时间记录,代码更简洁:

SELECT * 
FROM REPORT t1
ASOF LEFT JOIN ITEM t2
  ON t1.ITEM = t2.ITEM
  AND t2.EFFECTIVE_DATE <= t1.INVOICE_DATE;

两种写法执行后都可以得到期望的结果:

INVOICE_DATEITEMITEMQUANTITYEFFECTIVE_DATE
2021-02-01100100102021-01-01
2021-09-1010010052021-09-01

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:42:02