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])
我正在为只获取每张票的最后一个非空白值而苦苦挣扎。
在 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])