Power Query `List.Generate` 运行太慢

问题描述 投票:0回答:1

TL;博士

如何更快地计算 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。

powerbi powerquery etl m
1个回答
0
投票

如果你开始

enter image description here

然后您可以使用它来创建新的批次号,然后扩展数据字段。 如果省略最后一个索引步骤,您还会有唯一但不连续的批次

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"

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.