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

Power BI表格数据处理技术咨询:获取最近9个值的最大值及按日期+小时分组取最近5个值

嘿,我来帮你搞定这两个Power BI里的DAX难题,这俩场景日常做分析时挺常见的,咱们一步步拆解:

问题1:获取表格内最近9个值的最大值

首先得明确“最近”的判定依据——一般是按日期/时间排序,对吧?咱们可以用TOPN先筛选出最近的9条记录,再用MAXX取它们的最大值。假设你的表格里有日期列[Date]和数值列[Value],可以这么写度量值:

Max_Last9Values = 
VAR CurrentDate = MAX('Table'[Date])
VAR Last9Rows = 
    TOPN(
        9,
        FILTER(ALL('Table'), 'Table'[Date] <= CurrentDate),
        'Table'[Date], DESC
    )
RETURN
    MAXX(Last9Rows, 'Table'[Value])

简单解释下逻辑:

  1. 先拿到当前上下文里的最大日期(比如表格当前行对应的日期);
  2. 筛选出所有日期早于等于这个日期的行,按日期降序取前9条;
  3. 最后遍历这9条记录,取出数值列的最大值。

如果你的“最近”是按行的插入顺序(而非日期),把排序依据换成索引列就行,比如'Table'[Index], DESC。

问题2:按日期+小时维度获取最近5个值(处理日期重复、小时不同的情况)

这个场景的核心是把日期+小时当成一个复合时间维度,先给每个时间点排好序,再筛选出当前时间点之前的5个(包括自身)。这里分两种写法,你可以选适合自己的:

方法1:先建计算列简化排序

先给表格加一个计算列,把日期和小时合并成完整的时间戳,方便后续排序:

FullDateTime = 'Table'[Date] + TIME('Table'[Hour], 0, 0)

然后创建度量值(这里以取最近5个值的最大值为例,你可以换成AVERAGEX/SUMX等):

Last5Values_Max = 
VAR CurrentTime = MAX('Table'[FullDateTime])
VAR AllTimePoints = ALL('Table'[FullDateTime])
-- 给每个时间点按时间先后排名
VAR SortedTimePoints = ADDCOLUMNS(AllTimePoints, "@Rank", RANKX(AllTimePoints, [FullDateTime],, ASC))
-- 拿到当前时间点的排名
VAR CurrentRank = MAXX(FILTER(SortedTimePoints, [FullDateTime] = CurrentTime), [@Rank])
-- 筛选出最近的5个时间点(当前排名-4到当前排名)
VAR TargetTimePoints = FILTER(SortedTimePoints, [@Rank] >= CurrentRank - 4 && [@Rank] <= CurrentRank)
-- 获取这些时间点对应的数值
VAR TargetValues = 
    CALCULATETABLE(
        VALUES('Table'[Value]),
        FILTER(ALL('Table'), 'Table'[FullDateTime] IN SELECTCOLUMNS(TargetTimePoints, "Time", [FullDateTime]))
    )
RETURN
    MAXX(TargetValues, [Value])

方法2:纯度量值(无需计算列)

如果不想加计算列,也可以直接在度量值里处理日期+小时的组合排序:

Last5Values_Max = 
VAR CurrentDate = SELECTEDVALUE('Table'[Date])
VAR CurrentHour = SELECTEDVALUE('Table'[Hour])
-- 生成所有日期+小时的组合,并给每个组合按时间排序
VAR AllDateHourCombos = 
    ADDCOLUMNS(
        ALL('Table'[Date], 'Table'[Hour]),
        "@SortKey", 'Table'[Date] + TIME('Table'[Hour], 0, 0),
        "@Rank", RANKX(ALL('Table'[Date], 'Table'[Hour]), 'Table'[Date] + TIME('Table'[Hour], 0, 0),, ASC)
    )
-- 拿到当前日期+小时组合的排名
VAR CurrentRank = 
    MAXX(
        FILTER(AllDateHourCombos, 'Table'[Date] = CurrentDate && 'Table'[Hour] = CurrentHour),
        [@Rank]
    )
-- 筛选出最近的5个组合
VAR TargetCombos = FILTER(AllDateHourCombos, [@Rank] >= CurrentRank - 4 && [@Rank] <= CurrentRank)
-- 获取这些组合对应的数值
VAR TargetValues = 
    CALCULATETABLE(
        'Table'[Value],
        TREATAS(
            SELECTCOLUMNS(TargetCombos, "Date", 'Table'[Date], "Hour", 'Table'[Hour]),
            'Table'[Date], 'Table'[Hour]
        )
    )
RETURN
    MAXX(TargetValues, [Value])

注意事项:

  • 确保[Date]是日期类型,[Hour]是数值类型(0-23),不然排序会出错;
  • 如果同一日期+小时下有多条记录,你可以调整逻辑,比如按每条记录的精确时间戳排序,而不是日期+小时的组合;
  • 测试时用表格可视化,把Date和Hour拖到行区域,再放度量值,就能看到每行对应的最近5个值的结果了。

内容的提问来源于stack exchange,提问作者Catherine LE CALVE

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 22:12:42