销售需求丨并列排名问题

在DAX函数中,关于排名的函数有RANKX和TOPN函数,这两个函数白茶已经写过很多文章了,都是关于排名问题的,但是,实际情况中,根据我们中国式报表的需求,怎么可能仅仅如此?

先看数据:

需求对话:

BOSS:白茶,我需要一个排名!

我:我之前不是做过很多期了么?

BOSS:不行!你做的什么玩意,怎么排第一的那么多人?我要排出个123来,不要并列!懂不懂!

我:…(@#¥……@%¥!)那,并列的情况下靠什么判断么?

BOSS:你咋这么笨呢!时间!先到先得!

我:↓↓↓↓↓

将数据导入到PowerBI中,结果如下:

编写基础代码:

金额 = 
SUM ( '示例'[销售金额] )

结果如下:

按照我们常规的写法,代码是这样子的:

排名 = 
IF ( HASONEFILTER ( '示例'[员工] ), RANKX ( ALL ( '示例' ), [金额],, DESC, DENSE ) )

结果是这样子的:

按照咱们中国老板的需求,1就是1,2就是2,我不要那么多花里胡哨的,1就是1!也是很无奈的。

群里面的大佬有很多种解决方案,主要都是采用构建虚拟表的方式,白茶觉得不太好理解。

但是有一个别的思路,就是绕开虚拟表,在不使用任何其他维度的情况下该如何处理呢?

刚才说了,当金额一致的情况下,需要考虑时间,那么把时间也作为数值加进去不就得了!这个属于利用加权的算法,将时间与金额合二为一。代码如下:

并列排名 = 
IF (
    HASONEFILTER ( '示例'[员工] ),
    RANKX (
        ALL ( '示例' ),
        [金额] + DIVIDE ( 10000, CALCULATE ( MIN ( '示例'[日期] ) ) ),
        ,
        DESC,
        DENSE
    )
)

结果如下:

这样是不是就达到了中国式报表的需求了?解释一下:

IF+HASONEFILTER是为了去掉总计栏显示的问题,之前提到过很多次了。

ALL的使用是绝对排名,为整张表中的排名准备。

DESC是按照从大到小排名,DENSE是按照中国式排名进行。

核心,在于添加了一个DIVIDE的值。当日期越大时,这个值越小,所有的金额都与这个值相加作比较,就相当于给每一个金额加了小数位,而小数位的值由日期决定。

特别注意,MIN函数外面需要嵌套一层CALCULATE函数,因为涉及到行上下文日期转换为筛选上下文日期的问题。

本期案例数据在下面的知识星球中,点击可加入白茶的星球。
小伙伴们,GET了么?
(白茶:Biu~❤)

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

下面这个知识星球是针对有实际需求的小伙伴,有需要的请加入下面的知识星球。
(这个星球里面有白茶之前所有的案例文件。)

ID:Storysming

### 回答1: 在 SQL Server 中,可以使用 `DENSE_RANK()` 函数来对查询结果进行排名,包括数值并列排名。下面是一个示例: 假设有一个 `sales` 表,包含以下数据: | id | sales | | --- | ----- | | 1 | 100 | | 2 | 200 | | 3 | 300 | | 4 | 200 | | 5 | 400 | 要按照销售额对数据进行排名,并且对于销售额相同的行,需要使用并列排名,可以使用以下 SQL 查询: ```sql SELECT id, sales, DENSE_RANK() OVER (ORDER BY sales DESC) as rank FROM sales ``` 结果如下: | id | sales | rank | | --- | ----- | ---- | | 5 | 400 | 1 | | 3 | 300 | 2 | | 2 | 200 | 3 | | 4 | 200 | 3 | | 1 | 100 | 4 | 其中,`DENSE_RANK()` 函数的作用是对销售额进行排名,`ORDER BY sales DESC` 指定按照销售额从大到小进行排列。使用 `OVER` 子句可以在查询结果中添加排名列,从而得到最终的结果。在本例中,销售额为 200 的行的排名是 3,而不是 4,这是因为它们并列排名。 ### 回答2: 在SQL Server中,可以使用窗口函数联结等方法来实现查询结果的排名数值并列排名。 1. 使用窗口函数: 我们可以使用窗口函数中的ROW_NUMBER()来为查询结果进行排名。以下是一个示例查询: ``` SELECT column1, column2, column3, ROW_NUMBER() OVER (ORDER BY column3 DESC) AS Rank FROM your_table ``` 在上述查询中,我们将结果按照column3列的降序排列,并为每一行指定一个排名排名的值将存储在一个名为Rank的新列中。 2. 数值并列排名: 如果要处理数值并列排名,可以使用DENSE_RANK()窗口函数。DENSE_RANK()函数会为相同数值的行分配相同的排名,而不跳过任何排名。 以下是一个示例查询: ``` SELECT column1, column2, column3, DENSE_RANK() OVER (ORDER BY column3 DESC) AS Rank FROM your_table ``` 在上述查询中,我们再次按照column3列的降序排列,并为相同数值的行分配相同的排名排名的值将存储在一个名为Rank的新列中。 需要注意的是,如果有并列排名的行数超过窗口函数的支持范围,可能会导致结果不准确。在这种情况下,您可以考虑使用自定义的查询排序逻辑来实现数值并列排名。 ### 回答3: 在 SQL Server 中查询结果的排名有多种方法,其中一种常用的方法是使用窗口函数(Window Function)。 假设有一张名为"Sales"的表,包含了销售额的数据。要按照销售额进行排名,并且当销售额相同时,需要并列排名。可以使用以下的 SQL 查询语句来实现: ```sql SELECT SalesPerson, SalesAmount, DENSE_RANK() OVER (ORDER BY SalesAmount DESC) AS SalesRank FROM Sales ORDER BY SalesRank ``` 在上述的查询语句中,首先通过 `OVER` 子句指定了窗口函数的排序方式,这里按照销售额(`SalesAmount`)进行降序排序。然后使用 `DENSE_RANK()` 函数来计算销售额的稠密排名(即并列排名)。最后将结果按照销售排名(`SalesRank`)进行升序排序,以得到最终的排名结果。 执行上述查询后,将会返回一个结果集,其中包含了每个销售人员的姓名、销售销售排名,其中销售排名并列的情况下将会显示相同的值。 需要注意的是,使用窗口函数进行排名的功能是从 SQL Server 2005 起引入的,如果需要在更早的版本上进行排名操作,可能需要使用其他的方法来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fabric丨白茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值