首页 文章

RANKX使用DAX发行

提问于
浏览
1

我正在努力将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函数 . 基本上,为了实现转换,我使用以下表达式创建了一个新的计算列:

Ranking on partition

要恢复它,它会对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的较低/较高等级) .

此外,我的过滤器只是在过滤器的日期不正确时应用空白但排名保持不变...

我试图直接做一个措施中的独特计数,但无法保存遇到的不同问题...你有一些想法吗?

(并感谢您的回答):)

1 回答

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

相关问题