Function 电力查询中的迭代计算

Function 电力查询中的迭代计算,function,iteration,powerbi,powerquery,m,Function,Iteration,Powerbi,Powerquery,M,我有一个数据集: Policy, EXPIRY_DT, TIMESTAMP, Investment Prudential, 10/31/2019, 8/9/2019, 0 Prudential, 10/31/2019, 8/8/2019, 0 Prudential, 10/31/2019, 8/7/2019, 0 Prudential, 10/31/2019, 8/6/2019, -20550 Prudential, 10/31/2019, 8/5/2019, 0 Prude

我有一个数据集:

Policy,     EXPIRY_DT,  TIMESTAMP, Investment
Prudential, 10/31/2019, 8/9/2019,  0
Prudential, 10/31/2019, 8/8/2019,  0
Prudential, 10/31/2019, 8/7/2019,  0
Prudential, 10/31/2019, 8/6/2019,  -20550
Prudential, 10/31/2019, 8/5/2019,  0
Prudential, 10/31/2019, 8/2/2019,  21300
Prudential, 10/31/2019, 8/1/2019,  30000
Prudential, 10/31/2019, 7/31/2019, 0
Prudential, 10/31/2019, 7/30/2019, 29250
Prudential, 10/31/2019, 7/29/2019, 0
Prudential, 10/31/2019, 7/26/2019, 33900
我的需要是:

对于特定“到期日”的特定“保单”
如果今天的“投资”+前一天的“累计投资”<0,
那么今天的“累计投资”=0,
否则今天的“累计投资”=今天的“投资”+前一天的“累计投资”

输出应该如下所示:

Policy,     EXPIRY_DT,  TIMESTAMP, Investment, Cumulative Investment
Prudential, 10/31/2019, 8/9/2019,  0,          93900
Prudential, 10/31/2019, 8/8/2019,  0,          93900
Prudential, 10/31/2019, 8/7/2019,  0,          93900
Prudential, 10/31/2019, 8/6/2019,  -20550,     93900
Prudential, 10/31/2019, 8/5/2019,  0,          114450
Prudential, 10/31/2019, 8/2/2019,  21300,      114450
Prudential, 10/31/2019, 8/1/2019,  30000,      93150
Prudential, 10/31/2019, 7/31/2019, 0,          63150
Prudential, 10/31/2019, 7/30/2019, 29250,      63150
Prudential, 10/31/2019, 7/29/2019, 0,          33900
Prudential, 10/31/2019, 7/26/2019, 33900,      33900

我可以在Excel工作表中实现它,但是有没有办法在Powerquery内部实现它?

虽然我不知道伪代码如何产生您指定的输出,但我相信这可能会帮助您开始。就我所知,在PowerQuery中这样做是很困难的,但并非不可能有效地做到。实现这一点的最有效方法是使用以下代码创建一个计算列

Cummulative Investment = 
    var _thisPeriod = 
        CALCULATE (
            SUM ( Investments[Investment] ) ;
            ALL ( Investments ) ; 
            Investments[Policy] = EARLIER( Investments[Policy] ) ; 
            Investments[EXPIRY_DT] = EARLIER( Investments[EXPIRY_DT] ) ;
            Investments[TIMESTAMP] = EARLIER( Investments[TIMESTAMP] ) 
        )
    var _prevPeriod = 
        CALCULATE (
            SUM ( Investments[Investment] ) ;
            ALL ( Investments ) ; 
            Investments[Policy] = EARLIER( Investments[Policy] ) ; 
            Investments[EXPIRY_DT] = EARLIER( Investments[EXPIRY_DT] ) ;
            Investments[TIMESTAMP] <= EARLIER( Investments[TIMESTAMP] ) - 1 
        )

RETURN
    IF ( _thisPeriod + _prevPeriod < 0 ; 0 ; _thisPeriod + _prevPeriod )
累计投资=
变量_此期间=
算计(
金额(投资[投资]);
所有(投资);
投资[政策]=早期(投资[政策]);
投资[到期日]=更早(投资[到期日]);
投资[时间戳]=更早(投资[时间戳])
)
变量_前期=
算计(
金额(投资[投资]);
所有(投资);
投资[政策]=早期(投资[政策]);
投资[到期日]=更早(投资[到期日]);

投资[时间戳]虽然我不知道您的伪代码将如何产生您指定的输出,但我相信这可能有助于您入门。据我所知,在PowerQuery中执行此操作很难,也不是不可能有效。完成此操作的最有效方法是使用以下代码创建计算列

Cummulative Investment = 
    var _thisPeriod = 
        CALCULATE (
            SUM ( Investments[Investment] ) ;
            ALL ( Investments ) ; 
            Investments[Policy] = EARLIER( Investments[Policy] ) ; 
            Investments[EXPIRY_DT] = EARLIER( Investments[EXPIRY_DT] ) ;
            Investments[TIMESTAMP] = EARLIER( Investments[TIMESTAMP] ) 
        )
    var _prevPeriod = 
        CALCULATE (
            SUM ( Investments[Investment] ) ;
            ALL ( Investments ) ; 
            Investments[Policy] = EARLIER( Investments[Policy] ) ; 
            Investments[EXPIRY_DT] = EARLIER( Investments[EXPIRY_DT] ) ;
            Investments[TIMESTAMP] <= EARLIER( Investments[TIMESTAMP] ) - 1 
        )

RETURN
    IF ( _thisPeriod + _prevPeriod < 0 ; 0 ; _thisPeriod + _prevPeriod )
累计投资=
变量_此期间=
算计(
金额(投资[投资]);
所有(投资);
投资[政策]=早期(投资[政策]);
投资[到期日]=更早(投资[到期日]);
投资[时间戳]=更早(投资[时间戳])
)
变量_前期=
算计(
金额(投资[投资]);
所有(投资);
投资[政策]=早期(投资[政策]);
投资[到期日]=更早(投资[到期日]);

在Power查询中,如果您不害怕M语言,那么您可以在O(n)中高效地执行此操作。如果性能不是问题,那么在M as O(n^2)中有更简单的方法来执行此操作


这是一个很好的例子,说明了如何使用
List.Accumulate
函数来完成此操作

let
    StartingTable = <Table Source Goes Here>,
    SortAndBuffer = Table.Buffer(Table.Sort(StartingTable,{{"TIMESTAMP", Order.Ascending}})),
    TableType = Value.Type(Table.AddColumn(SortAndBuffer, "Cumulative Investment", each null, type number)),
    Cumulative = List.Skip(List.Accumulate(SortAndBuffer[Investment],{0},(cumulative,Investment) => cumulative & {List.Last(cumulative) + Investment})),
    AddCumulativeCol = Table.FromColumns(Table.ToColumns(SortAndBuffer)&{Cumulative},TableType)
in
    AddCumulativeCol
从单元素列表
{0}
开始,对于
投资
列列表中的每个值,它接受该(最初为单值)列表,并添加上一个值加上当前
投资
值的另一个值

这将生成列表

{0,33900,33900,63150,63150,93150,114450,114450,93900,93900,93900,93900}
列表。跳过
去掉最初的零

最后,使用
table.FromColumns
将此列表作为列添加到起始表中


在DAX中,您可以编写一个相当简单的计算列,如下所示:

Cumulative Investment =
VAR CumulativeSum =
    CALCULATE (
        SUM ( 'Table'[Investment] ),
        ALLEXCEPT ( 'Table', 'Table'[Policy], 'Table'[EXPIRY_DT] ),
        'Table'[TIMESTAMP] <= EARLIER ( 'Table'[TIMESTAMP] )
    )
RETURN MAX(CumulativeSum,0)
累计投资=
累积风险=
算计(
总额(‘表’[投资]),
ALLEXCEPT('Table','Table'[策略],'Table'[到期日]),

在Power查询中的'Table'[TIMESTAMP]中,如果您不害怕M语言,那么您可以在O(n)中高效地执行此操作。如果性能不是问题,那么在M as O(n^2)中有更简单的方法来执行此操作


这是一个很好的例子,说明了如何使用
List.Accumulate
函数来完成此操作

let
    StartingTable = <Table Source Goes Here>,
    SortAndBuffer = Table.Buffer(Table.Sort(StartingTable,{{"TIMESTAMP", Order.Ascending}})),
    TableType = Value.Type(Table.AddColumn(SortAndBuffer, "Cumulative Investment", each null, type number)),
    Cumulative = List.Skip(List.Accumulate(SortAndBuffer[Investment],{0},(cumulative,Investment) => cumulative & {List.Last(cumulative) + Investment})),
    AddCumulativeCol = Table.FromColumns(Table.ToColumns(SortAndBuffer)&{Cumulative},TableType)
in
    AddCumulativeCol
从单元素列表
{0}
开始,对于
投资
列列表中的每个值,它接受该(最初为单值)列表,并添加上一个值加上当前
投资
值的另一个值

这将生成列表

{0,33900,33900,63150,63150,93150,114450,114450,93900,93900,93900,93900}
列表。跳过
去掉最初的零

最后,使用
table.FromColumns
将此列表作为列添加到起始表中


在DAX中,您可以编写一个相当简单的计算列,如下所示:

Cumulative Investment =
VAR CumulativeSum =
    CALCULATE (
        SUM ( 'Table'[Investment] ),
        ALLEXCEPT ( 'Table', 'Table'[Policy], 'Table'[EXPIRY_DT] ),
        'Table'[TIMESTAMP] <= EARLIER ( 'Table'[TIMESTAMP] )
    )
RETURN MAX(CumulativeSum,0)
累计投资=
累积风险=
算计(
总额(‘表’[投资]),
ALLEXCEPT('Table','Table'[策略],'Table'[到期日]),

“表”[时间戳]您好。问题。您打算如何显示此结果?因为如果您只想将此输出用于表可视化,您可以构建一个年初至今的度量值,以防累计投资每年发生变化。而在Power Query M语言中这是可能的。DAX和M都可以处理累计总和。您好。问题。您打算如何显示此结果?beca如果您只想将该输出用于表可视化,则可以使用。如果累计投资每年发生变化,则可以构建一个年初至今的度量。而在Power Query M语言中,这是可能的。DAX和M都可以处理累计总和。