Excel 数据模型:Return 最后一个非空白

Excel data model: Return last non blank

我正在为只获取每张票的最后一个非空白值而苦苦挣扎。
在 Power Pivot 度量中,我使用了一个函数 LASTNONBLANK() ,但结果并不可靠——可能是因为数据模型没有考虑行的原始顺序。
Excel 公式或 VBA 不是一个选项,我认为在 Power Query 中它不会很有效。

门票 时间戳
1 1 2021 年 7 月 28 日 04:15 下午
1 2 2021 年 7 月 28 日 04:23 下午 一个
1 3 2021 年 7 月 28 日 04:30 下午
1 4 2021 年 7 月 28 日 04:37 下午 b
1 5 2021 年 7 月 28 日 04:44 下午
1 6 2021 年 7 月 28 日 04:51 下午
1 7 2021 年 7 月 28 日 04:59 下午
2 1 2021 年 7 月 29 日 01:51 下午 一个
2 2 2021 年 7 月 29 日 02:49 下午 b
2 3 2021 年 7 月 29 日 03:47 下午 c
2 4 2021 年 7 月 29 日 04:44 下午
2 5 2021 年 7 月 29 日 05:42 下午 一个
2 6 2021 年 7 月 29 日 06:39 下午

对于工单“1”,返回值应为“b”(第 4 步),对于工单“2”,返回值应为“a”(第 5 步)。

门票
1 b
2 一个

特别是因为数据是排序的,在Power Query中很简单:

  • 删除空白值行
  • 按票号分组
    • Return 每组中的最后一个值

(如果没有排序,就给Group里的每个子表加一个排序)

M代码

let
    Source = Excel.CurrentWorkbook(){[Name="Table28"]}[Content],

    #"Changed Type" = Table.TransformColumnTypes(Source,{
        {"ticket", Int64.Type}, 
        {"step", Int64.Type}, 
        {"timestamp", type datetime}, 
        {"value", type text}}),

    #"Filtered Rows" = Table.SelectRows(#"Changed Type", each ([value] <> null)),
 
    #"Grouped Rows" = Table.Group(#"Filtered Rows", {"ticket"}, {
        {"Last Non-Blank", each List.Last([value])}
        })

in
    #"Grouped Rows"

PBI 社区帮助我使用 2 种不同的解决方案创建了 Power Pivot 度量,两者都运行顺利。

VAR _lasttimestampnonblank =
CALCULATE ( MAX ( Data[timestamp] ), Data[value] <> BLANK () )
RETURN
IF (
HASONEVALUE ( Data[ticket] ),
CALCULATE ( VALUES ( Data[value] ), Data[timestamp] = _lasttimestampnonblank )
)

和第二个解决方案:

Measure 2 = 
    VAR __Table = FILTER('Table7',[value]<>"")
    VAR __Max = MAXX(__Table,[timestamp])
RETURN
    MAXX(FILTER(__Table,[timestamp] = __Max),[value])