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都可以处理累计总和。