我正在努力将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<=(DATEADD(month, -1, GETDATE()))
>)
>SELECT COUNT(idU_Email)
> FROM cte
> WHERE rang = 1
> and valeur = 1
如果我理解的话,相当于DAX中RANKX函数中sql中的rownumber函数。 基本上,为了实现转换,我使用以下表达式创建了一个新的计算列:
要恢复它,它会对dRecueil和valeur的每个idU_Email订单进行排名。
因此,唯一要做的就是在日期添加一个条件(比如在我的SQL请求中),但我想我真的不知道如何(或在哪里?),并且在发生错误时发生了错误我尝试过,但我还没有实现解决问题:
Ranking on partition with filter on date
我希望有人能找到解决问题的方法(或者甚至建议我更好地使用相应的SQL请求)。
先谢谢!笑脸快乐
[UPDATE]
我已按照自己的意愿实现了分区并应用了类似的日期过滤器:
RANK_OnDate = IF(vUE[dRecueil] <= DATE(YEAR(TODAY()); MONTH(TODAY())-1; DAY(TODAY()))
;RANKX(FILTER(vUE; vUE[idU_Email] = EARLIER(vUE[idU_Email]) && 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)。
此外,如果过滤器的日期不合适,我的过滤器只会应用空白但排名保持不变...
我试图在一个小节中直接进行不同的计数,但不能保存遇到的不同问题......你有什么想法吗?
(感谢您的回答):)
答案 0 :(得分:0)
我认为你非常接近,试试这个
Rank = IF(vUE[dRecueil] <= DATE(YEAR(TODAY()), MONTH(TODAY())-1, DAY(TODAY())),
RANKX(FILTER(vUE, vUE[idU_Email] = EARLIER(vUE[idU_Email])),
RANKX(ALL(vUE), vUE[dRecueil], ,ASC) +
DIVIDE(
RANKX(ALL(vUE), vUE[valeur], , DESC, Skip),
COUNTROWS(ALL(vUE)) + 1)))