如何更快地计算 Power Query 中的运行总和?我使用了表缓冲和
List.Generate
但它仍然太慢。
我有一张这样的桌子:
日期时间 | 瓦尔 | 最大值 | 其他列 |
---|---|---|---|
2024-12-12 00:00:00 | 0 | 3 | ... |
2024-12-12 00:00:01 | 0 | 3 | ... |
2024-12-12 00:00:03 | 1 | 3 | ... |
2024-12-12 00:00:04 | 2 | 3 | ... |
2024-12-12 00:00:10 | 3 | 3 | ... |
2024-12-12 00:00:11 | 0 | 2 | ... |
2024-12-12 00:00:12 | 1 | 2 | ... |
2024-12-12 00:00:13 | 2 | 2 | ... |
2024-12-12 00:00:15 | 2 | 2 | ... |
2024-12-12 00:00:16 | 0 | 5 | ... |
val
从0开始,增加直到等于maxval
,然后从0重新开始。可能有多个连续的val
具有相同的值。
我应该使用 Power Query(在
PowerQueryNet上运行)创建一批
val
(从 0 到 maxval
)。 maxval
多个批次可以相同。
我的方法是创建一个
batchChange
列,对于新批次开始的每一行为 1,对于所有其他行为 0,然后计算 batchChange
的运行总和,为每个批次提供新的 batchId
。
日期时间 | 瓦尔 | 最大值 | 批量更改 | 批次ID | 其他列 |
---|---|---|---|---|---|
2024-12-12 00:00:00 | 0 | 3 | 0 | 0 | ... |
2024-12-12 00:00:01 | 0 | 3 | 0 | 0 | ... |
2024-12-12 00:00:03 | 1 | 3 | 0 | 0 | ... |
2024-12-12 00:00:04 | 2 | 3 | 0 | 0 | ... |
2024-12-12 00:00:10 | 3 | 3 | 0 | 0 | ... |
2024-12-12 00:00:11 | 0 | 2 | 1 | 1 | ... |
2024-12-12 00:00:12 | 1 | 2 | 0 | 1 | ... |
2024-12-12 00:00:13 | 2 | 2 | 0 | 1 | ... |
2024-12-12 00:00:15 | 2 | 2 | 0 | 1 | ... |
2024-12-12 00:00:16 | 0 | 5 | 1 | 2 | ... |
计算
batchChange
很容易。使用两个索引(从 0 和 1)并将它们连接起来,我在每行中都有前一行的 val
和 maxval
,并且 if
可以检测该行是否是新批次的开始。对于约 6000 行,只需不到一秒。
但是,计算
batchId
需要很长时间!我缓冲了 batchChangedTbl
并禁用了查询折叠,将其改进为 30 秒,但仍然太长。
batchId = List.Generate(
() => [idx = 1, bid = 0],
each [idx] <= Table.RowCount(batchChangedTbl),
each [
bid = [bid] + batchChangedTbl{idx - 1}[batchChange],
idx = [idx] + 1
],
each [bid]
)
我认为随着行数增加,时间呈指数增长,它会重新计算每一行的整个列表。
如何更快地创建
batchId
? Power Query 有没有更快的方法?我知道像 Pandas 或 DAX 这样的工具更适合解决这个问题,但我仅限于 Power Query。
如果你开始
然后您可以使用它来创建新的批次号,然后扩展数据字段。 如果省略最后一个索引步骤,您还会有唯一但不连续的批次
let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Added Index" = Table.AddIndexColumn(Source, "Index", 0, 1, Int64.Type),
#"Added Custom" = Table.AddColumn(#"Added Index", "Custom",
each
if [Index]=0 then 0 else
if [val]=0 then
if #"Added Index"{[Index]-1}[val]=0 then null else [Index]
else null),
#"Filled Down" = Table.FillDown(#"Added Custom",{"Custom"}),
#"Grouped Rows" = Table.Group(#"Filled Down", {"Custom"}, {{"data", each _, type table }}),
#"Added Index1" = Table.AddIndexColumn(#"Grouped Rows", "NewBatch", 0, 1, Int64.Type)
in #"Added Index1"