在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木小桼