保留百分比

时间:2018-10-18 17:55:14

标签: powerbi dax

我正在尝试在给定的时间段内(按月,年初至今和每年)为政策创建“保留率”。因此,与给定时间段内有效的策略相比,给定时间段内的所有策略。

政策可以是:

    N=New
    RN=ReNew
    C=Cancel
    RI=ReInstate
    NR=NonRenew 

交易数据有点像这样,我可以派生StatusNum来显示有效状态。

PolicyID PolicyNum StatusDate Status StatusNum Net 
1        123       1/1/2018   N         1      1
2        123       3/31/2018  C         0      -1
3        123       4/1/2018   RI        1      +1
4        123       6/1/2018   RN        1      0
5        222       2/1/2018   N         1      1
6        222       7/1/2018   RN        1      0
7        333       1/1/2018   N         1      1
8        333       6/1/2018   NR        0     -1
9        444       1/1/2018   N         1      1
10       444       5/30/2018  C         0     -1

关于如何执行此操作的最佳猜测是,将PIT上的最后StatusNum值的总和除以开始PIT处的第一个StatusNum值。因此,如果我按日期1/1/2018到8/1/2018

  • 123将生效(+ 1,+ 1)
  • 222尚未生效(因此不算任何东西)(+ 0,+ 0)
  • 333刚开始生效,但未续约(+ 1,-1)
  • 444刚开始生效,但取消了(+ 1,-1)

因此,其中3个策略于2018年1月1日生效,而2个已取消,其中1个无关紧要,因此保留率为33.3%

如果这是执行此操作的最佳方法以及如何完成此操作,谁能提供反馈?

预先感谢您的帮助。

更新

这是我想要的,但是太慢了:

'AsOfPolicies = var A = SELECTCOLUMNS(SUMMARIZECOLUMNS(Transactions [PolicyNumber],filter(Transactions,Transactions [DateKey] = min(Transactions [DateKey])&& Transactions [IsInForce] =-1)),“ aPolicyNumber”,[PolicyNumber])
var B = SELECTCOLUMNS(SUMMARIZECOLUMNS(Transactions [PolicyNumber],filter(Transactions,Transactions [DateKey] <= MAX(Transactions [DateKey]))),“ MaxDate”,MAX(Transactions [DateKey])),“ bPolicyNumber”,[PolicyNumber ],“ MaxDate”,[MaxDate])var C = SELECTCOLUMNS(filter(CROSSJOIN(A,B),[aPolicyNumber] = [bPolicyNumber]),“ cPolicyNumber”,[aPolicyNumber],“ MaxDateKey”,[MaxDate]) 变量D = SELECTCOLUMNS(filter(CROSSJOIN(C,Transactions),[cPolicyNumber] = [PolicyNumber] && [MaxDateKey] = [DateKey]),“ PolicyNumber”,[PolicyNumber],“ PD_ID”,[PD_ID],“ IsInForce” ,[IsInForce]) 返回D'

更新

此外,过滤器似乎无法正常工作

1 个答案:

答案 0 :(得分:0)

我认为您可以执行以下操作:

Retention =
VAR StartDates =
    SUMMARIZE (
        ALLSELECTED ( PolicyLog ),
        PolicyLog[PolicyNum],
        "Start", MIN ( PolicyLog[StatusDate] )
    )
VAR Included =
    SELECTCOLUMNS (
        FILTER ( StartDates, [Start] <= MIN ( Dates[Date] ) ),
        "Policies", PolicyLog[PolicyNum]
    )
VAR Filtered = FILTER ( PolicyLog, PolicyLog[PolicyNum] IN Included )

RETURN
    DIVIDE (
        SUMX ( Filtered, PolicyLog[Net] ),
        COUNTROWS ( SUMMARIZE ( Filtered, PolicyLog[PolicyNum] ) )
    )

首先,创建一个表StartDates,该表将为每个策略提供最早的日期,该日期仅限于所选的时间范围。看起来像这样:

StartData = 

PolicyNum  Start
123        1/1/2018
222        2/1/2018
333        1/1/2018
444        1/1/2018

从那里,我们只想列出要在计算中包括哪些策略。因此,我们选择在日期切片器中最小选择日期上具有Start的那些。我们只需要一个生成的策略编号的列表,因此我们只选择该列。

Included =

Policies
123
333
444

从那里我们过滤整个PolicyLog表以仅包括这些表(Filtered)。

最后,我们可以为这些选定策略中的每一个添加Net列,然后除以它们的不同数量以获得保留率。


编辑:针对您的评论,我想您希望对StartDate变量有更多的选择。代替MIN( PolicyLog[StatusDate] ),尝试类似以下的方法:

CALCULATE( MIN(PolicyLog[StatusDate]), PolicyLog[Status] IN {"N", "RN", "RI"} )