Power BI中按条件添加另一表列:DAX/Power Query实现
如何通过日期关联两张表的百分比字段?
完全可以通过日期范围匹配来实现需求,这是处理「随时间更新的维度数据」的典型场景——核心是为Table1的每一条记录,找到对应时间点上生效的PERCENTAGE值(也就是该记录DATE之前最近的START_DATE对应的百分比)。如果业务规则允许,也可以用近似日期匹配,但前者更贴合“百分比随START_DATE更新生效”的逻辑。
方法1:日期范围精准匹配(推荐)
通过为Table2的每条记录标记生效时间区间,再匹配Table1的DATE落在哪个区间内:
WITH ranked_table2 AS ( SELECT ACCOUNT, START_DATE, PERCENTAGE, -- 获取同账户下下一条记录的START_DATE,作为当前百分比的失效日期 LEAD(START_DATE) OVER (PARTITION BY ACCOUNT ORDER BY START_DATE) AS END_DATE FROM Table2 ) SELECT t1.DATE, t1.ACCOUNT, t1.RESULTS, t2.PERCENTAGE FROM Table1 t1 LEFT JOIN ranked_table2 t2 ON t1.ACCOUNT = t2.ACCOUNT AND t1.DATE >= t2.START_DATE -- 若当前是该账户的最后一条记录,END_DATE为NULL,直接匹配 AND (t1.DATE < t2.END_DATE OR t2.END_DATE IS NULL)
方法2:找最近生效的记录
如果只需要每个Table1记录对应最新的、不晚于其DATE的START_DATE的百分比,用LATERAL JOIN(PostgreSQL、SQL Server支持)或相关子查询更简洁:
SELECT t1.DATE, t1.ACCOUNT, t1.RESULTS, t2.PERCENTAGE FROM Table1 t1 LEFT JOIN LATERAL ( SELECT PERCENTAGE FROM Table2 t2 WHERE t2.ACCOUNT = t1.ACCOUNT AND t2.START_DATE <= t1.DATE ORDER BY t2.START_DATE DESC LIMIT 1 ) t2 ON TRUE
近似日期匹配(仅业务允许时使用)
如果不需要严格的生效时间逻辑,只是想找最接近Table1.DATE的START_DATE对应的百分比,可以调整排序规则:
SELECT t1.DATE, t1.ACCOUNT, t1.RESULTS, t2.PERCENTAGE FROM Table1 t1 LEFT JOIN LATERAL ( SELECT PERCENTAGE FROM Table2 t2 WHERE t2.ACCOUNT = t1.ACCOUNT -- 按日期差绝对值排序,取最接近的一条 ORDER BY ABS(DATEDIFF(day, t1.DATE, t2.START_DATE)) LIMIT 1 ) t2 ON TRUE
注意:这种方法可能匹配到DATE之后的START_DATE,需要根据业务规则确认是否允许。
内容的提问来源于stack exchange,提问作者NiMa03
相关产品推荐
相关产品推荐

