我正在努力将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.
但我真的必须在一个小节中使用它,因为我希望用切片器动态修改我的日期条件
你有什么想法吗? 先谢谢!