在Power BI中使用RANK进行排序

声明:微软只是在新版本中新增了该函数,暂未有相关官方文档,本次也并不会对其性能和稳定性进行测试。

其实,在3月的时候微软就新增了该函数,今天浏览sqlbi时发现已经有文档了,然后兴冲冲跑去查看微软官方文档,发现并有官方文档,才注意到下面那行小字,果然是微软一如既往的风格。而且目前sqlbi上也未正式给它一个页面,而是后缀是一个编号。

RANK – DAX Guide — RANK – DAX 指南[1]

那就问一下gpt4吧,好吧 ,毕竟没联网,它也是不知道的。

好吧,还是老老实实查看sqlbi上的文档吧,从返回值可以看出又是一个窗口函数,熟悉sql sever的对窗口函数应该会非常熟悉,去年DAX上也更新了窗口函数,如WINDOW,INDEX,OFFSET。

先来尝试写一下,看下效果,

Sales.rankx = 
IF(
    NOT( ISBLANK( [Sales] )),
    RANKX(
        ALLSELECTED( 'Product Subcategory'[ProductSubcategoryName] ),
        [Sales]
    )
)


Sales.Rank = 
 IF(
    NOT( ISBLANK( [Sales] )),
    RANK(
        DENSE,
        ADDCOLUMNS( ALLSELECTED( 'Product Subcategory'[ProductSubcategoryName] ), "@sales", [Sales]  ),
        ORDERBY( [@sales],DESC )
    )
)

结果上来看,最直观的变化应该是在年份层级,使用RANK写法是没有显示排名的。

再来一个例子,写个简单的层级排名,

Sales.rankx2 = 
IF(
    NOT( ISBLANK( [Sales] ) ),
    SWITCH(
        TRUE(),
        ISINSCOPE( 'Product'[ProductName] ),
        RANKX(
            CALCULATETABLE(
                VALUES( 'Product'[ProductName] ),
                ALLSELECTED( 'Product'[ProductName] )
            ),
            [Sales]
        ),
        ISINSCOPE( 'Product'[BrandName] ),
        VAR cur = [Sales]
        return
            RANKX( 
                ALLSELECTED( 'Product'[BrandName] ),
                [Sales],
                cur
            )

    )
)

为了查看方便,限定一下产品的范围,结果没有任何问题

那么根据RANKX的方法,再来写下用RANK实现商品名级别的排序

Sales.rank2 error = 
RANK(
    DENSE,
    ADDCOLUMNS(
        CALCULATETABLE(
            VALUES( 'Product'[ProductName] ),
            ALLSELECTED( 'Product'[ProductName] )
        ),
        "@sales", [Sales]
    ),
    ORDERBY( [@sales], DESC )
)

提示Relation参数错误,也就是第二个参数表表达式的问题,包含了多个行上下文和筛选上下文,这就很有意思了,我们清除掉商品名称的筛选器再来看一下,结果变正常了。

那么问题就来了,这算是函数的缺陷,还是微软有意为之呢?还是等官方sqlbi的文档更新吧。在这之前建议不要在生产中使用该函数

引用链接

[1] RANK – DAX Guide — RANK – DAX 指南: https://dax.guide/?p=967


本篇文章来源于微信公众号: PowerBI木小桼

类似文章

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注