在更准确的时候?

时间:2018-03-30 08:28:28

标签: sql powerbi dax

我正在努力将sql请求转换为dax请求。请求如下:

> ;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
                )
            )

示例: 如果我们采用这样的数据集:

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.

但我真的必须在一个小节中使用它,因为我希望用切片器动态修改我的日期条件

你有什么想法吗? 先谢谢!

0 个答案:

没有答案