如何引用不同行中更早日期的值?求M与DAX实现公式
日期回溯取上年同期值(M语言+DAX语言实现)
需求:在表格的
Date列中回溯一年,将对应日期的Actual值填充到新的Actual PY列中。
尝试的M代码出现循环引用错误:let Source = tablename AddPYColumn = Table.AddColumn(Source, "PY", each let CurrentDate = [Date], OneYearAgo = Date.AddYears(CurrentDate, -1), PYValue = try Table.SelectRows(Source, each [combined] = [combined] and [Date] = OneYearAgo){0}[Actual] otherwise null in PYValue ) in AddPYColumn
M语言(Power Query)实现
循环引用的问题出在Table.AddColumn的行上下文里直接引用原表Source,同时用当前行的[combined]做匹配,导致上下文混淆。下面是两种可行的解决方式:
方式1:基于字典查找(高效)
let Source = tablename, // 创建以「combined+日期」为唯一键的查找字典 LookupTable = Table.AddColumn(Source, "匹配键", each Text.From([combined]) & "|" & Date.ToText([Date])), LookupDict = Record.FromList(LookupTable[Actual], LookupTable[匹配键]), // 添加Actual PY列 AddPYColumn = Table.AddColumn(Source, "Actual PY", each let 上年日期 = Date.AddYears([Date], -1), 目标匹配键 = Text.From([combined]) & "|" & Date.ToText(上年日期) in try Record.Field(LookupDict, 目标匹配键) otherwise null ) in AddPYColumn
方式2:分组后逐组处理
let Source = tablename, // 按combined分组,每组内匹配上年同期值 分组处理 = Table.Group(Source, {"combined"}, { {"组内数据", each let 按日期排序 = Table.Sort(_, {"Date", Order.Ascending}), 添加上年值 = Table.AddColumn(按日期排序, "Actual PY", each let 上年日期 = Date.AddYears([Date], -1), 匹配行 = Table.SelectRows(按日期排序, each [Date] = 上年日期) in if Table.RowCount(匹配行) > 0 then 匹配行{0}[Actual] else null ) in 添加上年值, type table} }), // 展开分组数据 最终结果 = Table.ExpandTableColumn(分组处理, "组内数据", Table.ColumnNames(Source) & {"Actual PY"}) in 最终结果
DAX语言实现
在Power BI或Excel中,通过CALCULATE结合日期函数,保留combined维度的筛选上下文即可实现:
通用聚合版(适用于有重复日期+combined的场景)
Actual PY = CALCULATE( SUM('Table'[Actual]), // 若需取单行值可替换为MAX/SELECTEDVALUE DATEADD('Table'[Date], -1, YEAR), ALLEXCEPT('Table', 'Table'[combined]) // 锁定当前行的combined维度 )
单行匹配版(适用于日期+combined唯一的场景)
Actual PY = VAR 当前日期 = 'Table'[Date] VAR 当前分组 = 'Table'[combined] RETURN CALCULATE( SELECTEDVALUE('Table'[Actual]), 'Table'[combined] = 当前分组, 'Table'[Date] = DATE( YEAR(当前日期)-1, MONTH(当前日期), DAY(当前日期) ) )
内容的提问来源于stack exchange,提问作者user23077405
相关产品推荐
相关产品推荐

