I was working on the conversion of a sql request into a dax one. The request is the following :
> ;WITH cte
> AS
> (
> SELECT uc.idU_Email
> ,uc.id_Type
> ,uc.dRecueil
> ,valeur
> ,ROW_NUMBER() OVER(PARTITION BY idU_Email,id_Type ORDER BY dRecueil DESC, valeur ASC) AS rang
> FROM vUE uc
> WHERE uc.Id_Type=1 AND uc.dRecueil<=DATE(02/04/2018)
> )
> SELECT COUNT(idU_Email)
> FROM cte
> WHERE rang = 1
> and valeur = 0
如果我理解得很好,sql中rownumber函数的等价物是DAX中的RANKX函数 . 所以基本上,为了实现转换,我创建了一个新的计算列 .
为了恢复它,它对idU_Email(主键)的每个分区和每个id_Type的另一个分区(在第一个分区内)进行排名,由dRecueil(日期)排序,然后由valeur(一点)排序,并且按日期条件(dRecueil)过滤 . 因此,我已经实现了我想要的分区并应用具有以下表达式的日期过滤器:
> RANK_OnDate2 = IF(vUE[dRecueil] <= DATE(02/04/2018)
> ;RANKX(FILTER(vUE; vUE[idU_Email] = EARLIER(vUE[idU_Email]) && vUE[dRecueil] <= DATE(02/04/2018) && vUE[id_Type] = EARLIER(vUE[id_Type]))
> ;RANKX(ALL(vUE); vUE[dRecueil]; ;ASC)
> +
> DIVIDE(
> RANKX(ALL(vUE); vUE[valeur]; ; DESC; Skip)
> ;COUNTROWS(ALL(vUE)) + 1
> )
> )
> )
最后,我计算了一个不同的Idu_Email,其中RANK_OnDate2 = 1和valeur = 0,这样我得到的结果与我的sql请求相同 .
问题是,我希望它动态过滤一个度量中保存的日期(用作切片器)...因此,我明白该列不能动态过滤,我应该做相当于我的SQL直接请求一个小节 .
我试图直接做一个措施中的独特计数,但我无法解决遇到的不同问题...
特别是,我没有实现在测量中使用早期的功能(或找到会做同样的事情)....
该措施应该在全球范围内看起来像这样:
TESTOptout2 = IF(vUE[dRecueil] <= My_Measures[datefilter]
;CALCULATE(
DISTINCTCOUNT(vUE[idU_Email])
;RANKX(FILTER(vUE; vUE[idU_Email] = EARLIER(vUE[idU_Email]) && vUE[dRecueil] <= My_Measures[datefilter] && vUE[id_Type] = EARLIER(vUE[id_Type]))
;RANKX(ALL(vUE); vUE[dRecueil]; ;ASC)
+
DIVIDE(
RANKX(ALL(vUE); vUE[valeur]; ; DESC; Skip)
;COUNTROWS(ALL(vUE)) + 1
)
) = 1
;vUE[valeur]=0
)
)
Example :如果我们采用这样的数据集:
Table : vUE
idU ||id_Type ||valeur ||dRecueil
1 ||1 ||1 ||02/04/2018
1 ||1 ||0 ||03/04/2018
1 ||1 ||1 ||01/04/2018
1 ||1 ||1 ||03/04/2018
1 ||2 ||1 ||01/04/2018
2 ||1 ||1 ||01/04/2018
2 ||3 ||1 ||02/04/2018
3 ||2 ||1 ||01/04/2018
4 ||1 ||1 ||01/04/2018
4 ||1 ||1 ||03/04/2018
5 ||1 ||1 ||03/04/2018
请求将首先按如下顺序排序数据:
idU ||id_Type ||valeur ||dRecueil
1 ||1 ||0 ||03/04/2018
1 ||1 ||1 ||03/04/2018
1 ||1 ||1 ||02/04/2018
1 ||1 ||1 ||01/04/2018
1 ||2 ||1 ||01/04/2018
2 ||1 ||1 ||01/04/2018
2 ||3 ||1 ||02/04/2018
3 ||2 ||1 ||01/04/2018
4 ||1 ||1 ||03/04/2018
4 ||1 ||1 ||01/04/2018
5 ||1 ||1 ||03/04/2018
然后根据日期条件(在dRecueil上)和Id_Type进行分组,所以如果我们保留sql请求的条件,我会返回:
idU ||id_Type ||valeur ||dRecueil
1 ||1 ||1 ||02/04/2018
2 ||1 ||0 ||01/04/2018
4 ||1 ||0 ||01/04/2018
5 ||1 ||1 ||03/04/2018
并且请求的最后一步是仅在valeur = 0的情况下计数,因此请求将返回2 .
但我真的必须只使用它,因为我希望我的日期条件可以用切片器动态修改
Have you got some ideas ? Thanks by advance !