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

如何引用不同行中更早日期的值?求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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 05:33:23