Forum Discussion
EARLIER Function
- 6 years ago
Since the introduction of VAR, there's no actual need for EARLIER any longer. So you might want to do it in a different way, perhaps easier to follow conceptually, and forget about EARLIER altogether (which is actually recommended nowadays):
Value2 = SWITCH ( TRUE (), Table1[GroupOrder] IN { 1, 4, 7 }, 0, Table1[GroupOrder] IN { 2, 5, 8 }, VAR PreviousGroupOrder_ = Table1[GroupOrder] - 1 RETURN CALCULATE ( DISTINCT ( Table1[Value 1] ), Table1[GroupOrder] = PreviousGroupOrder_, ALLEXCEPT ( Table1, Table1[Date] ) ), Table1[GroupOrder] IN { 3, 6, 9 }, VAR PreviousGroupOrder2_ = Table1[GroupOrder] - 2 RETURN CALCULATE ( DISTINCT ( Table1[Value 1] ), Table1[GroupOrder] = PreviousGroupOrder2_, ALLEXCEPT ( Table1, Table1[Date] ) ) )
Here is an example of what I need:
Date GroupOrder Value 1 Value 2
---------------------------------------------------------------------------------------------------------------------
20121231 1 322762272703.0400 0.0000
20121231 2 504993049586.4000 322762272703.0400
20121231 3 117421034783.7100 322762272703.0400
20121231 4 725451720271.6600 0.0000
20121231 5 1527350829053.5900 725451720271.6600
20121231 6 90925867161.1700 725451720271.6600
20121231 7 405811.0000 0.0000
20121231 8 105.0000 405811.0000
20121231 9 27.0000 405811.0000
When GroupOrder is 1,4,7 Value 2 should be 0
When GroupOrder is (2,5,8) Value 2 should have EARLIER(Value 1,1)
When GroupOrder is (3,6,9) Value 2 should have EARLIER(Value 1,2)
I was able to do it in SQL Server using LAG function. I don't know if it helps, but here is the SQL code:
SELECT DataReferencia, OrdemGrupo, GrupoInformacao, TipoInformacao, Valor AS ValorAtual,
CASE WHEN OrdemGrupo IN (2,5,8) THEN LAG(Valor,1,0) OVER (ORDER BY DataReferencia, OrdemGrupo, GrupoInformacao, TipoInformacao)
WHEN OrdemGrupo IN (3,6,9) THEN LAG(Valor,2,0) OVER (ORDER BY DataReferencia, OrdemGrupo, GrupoInformacao, TipoInformacao)
ELSE 0
END AS ValorTotal
FROM TCBLBI_Peso_Empresas_Tradadas
WHERE DataReferencia = 20121231
I hope it helps.
Hi Destrogiro
EARLIER works in a completely different way from what you seem to be assuming. It gives you access to the outer row context, not to the previous row. Try this for your calculated column, where I'm assuming you need this done by date:
Value2 =
SWITCH (
TRUE (),
Table1[GroupOrder] IN { 1, 4, 7 }, 0,
Table1[GroupOrder] IN { 2, 5, 8 }, CALCULATE (
DISTINCT ( Table1[Value 1] ),
Table1[GroupOrder]
= ( EARLIER ( Table1[GroupOrder] ) - 1 ),
ALLEXCEPT ( Table1, Table1[Date] )
),
Table1[GroupOrder] IN { 3, 6, 9 }, CALCULATE (
DISTINCT ( Table1[Value 1] ),
Table1[GroupOrder]
= ( EARLIER ( Table1[GroupOrder] ) - 2 ),
ALLEXCEPT ( Table1, Table1[Date] )
)
)
- AlB6 years agoCommunity Champion
Since the introduction of VAR, there's no actual need for EARLIER any longer. So you might want to do it in a different way, perhaps easier to follow conceptually, and forget about EARLIER altogether (which is actually recommended nowadays):
Value2 = SWITCH ( TRUE (), Table1[GroupOrder] IN { 1, 4, 7 }, 0, Table1[GroupOrder] IN { 2, 5, 8 }, VAR PreviousGroupOrder_ = Table1[GroupOrder] - 1 RETURN CALCULATE ( DISTINCT ( Table1[Value 1] ), Table1[GroupOrder] = PreviousGroupOrder_, ALLEXCEPT ( Table1, Table1[Date] ) ), Table1[GroupOrder] IN { 3, 6, 9 }, VAR PreviousGroupOrder2_ = Table1[GroupOrder] - 2 RETURN CALCULATE ( DISTINCT ( Table1[Value 1] ), Table1[GroupOrder] = PreviousGroupOrder2_, ALLEXCEPT ( Table1, Table1[Date] ) ) )- Destrogiro6 years agoRegular Visitor
Thank you very much, AlB !
It solved my problem!