alt

RANKX这个函数,白茶之前已经写过很多期了,本期是对RANKX函数一个细节问题的补充。

我们常见的数据类型有很多,用来聚合的主要有三种数据类型:文本、整数、小数。

在大部分场合,小数是实际FACT数据中最为常见的数据类型,当小数与RANKX函数组合的时候,会产生意想不到的小问题。

案例数据:

alt alt alt

案例数据比较简单,分别是产品表、分店表、销售事实表。

细心的小伙伴可能已经发现了,产品表中的价格和成本并不是整数,而是位数较多的小数。

将其导入到PowerBI中模型如下:

alt

构建基础指标:

1.销售金额:

001.SalesAmount = 
SUMX ( 'Fact_Sales', 'Fact_Sales'[Quantity] * RELATED ( Dim_Product[Price] ) )

2.销售成本:

002.SalesCost = 
SUMX ( 'Fact_Sales', 'Fact_Sales'[Quantity] * RELATED ( Dim_Product[Cost] ) )

3.销售毛利:

003.SalesProfit = 
[001.SalesAmount] - [002.SalesCost]

4.在分店表维度下,进行排名:

004.ProfitRankx = 
IF (
    HASONEFILTER ( Dim_Store[City] ),
    RANKX ( ALLSELECTED ( 'Dim_Store' ), [003.SalesProfit] )
)

展示效果如下:

alt

看到这里小伙伴会说,这不是挺正常的嘛,没看出来哪里不对啊。

别急,我们添加一个切片器,来查看一下筛选的效果。

alt

问题描述:

这里有一个很明显的问题,就是白茶RANKX函数内部使用的是ALLSELECTED函数,那么我们得到的排名结果应该是相对排名。

不添加切片器筛选的时候,总体排名和绝对排名是一样的,看起来没什么问题,但是一旦我们添加了切片器筛选,就会明显的看到,两个数值不同的度量值排名居然是一样的。

alt

这个问题产生的原因在于,我们计算依据的物理列价格和成本是包含小数的,多组小数格式数据计算会产生浮点数据,因此在底层逻辑转化过程中会造成数据的精度丢失。

因此解决办法有两种:

1.数据进入到PowerQuery中时,我们进行数据截断;

2.在计算结果上进行数据截断。

白茶推荐大家使用第二种方式,毕竟在PowerQuery中修改数据格式再进行数据UAT测试的时候,是很容易造成上下游数据偏差的。

修改RANKX度量值如下:

005.ProfitRankxAmend = 
IF (
    HASONEFILTER ( Dim_Store[City] ),
    RANKX ( ALLSELECTED ( 'Dim_Store' ), ROUND ( [003.SalesProfit], 2 ) )
)

展示效果如下:

alt alt alt alt

这里是白茶,一个PowerBI的初学者。 alt