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 !