[知识体系] 理解 TOPN

  [复制链接]
查看157883 | 回复143 | 2021-2-21 18:53:32 | 显示全部楼层 |阅读模式
如果说 RANKX 适合计算明细的名次数据,那么 TOPN 则可以批量返回结果,从一张表中返回所有满足条件的前 N 行记录。
如果说 RANKX 适合计算明细的名次数据,那么 TOPN 则可以批量返回结果,从一张表中返回所有满足条件的前 N 行记录。
TOPN
  1. TOPN ( <N_Value>, <Table>, [<OrderBy_Expression>], [<Order>], [<OrderBy_Expression>, … ] )
复制代码


TOPN 函数根一个或多个表达式的计算结果筛选数据,返回由第一参数中的前 N 行记录组成的表,当 N 为负数或 0 时返回空。

参数属性描述
N_Value需要返回的行数
Table用来返回行记录的表表达式
OrderBy_Expression可选

可重复
用来排序的表达式
Order可选

可重复
排序方式. 0/FALSE/DESC – 降序; 1/TRUE/ASC – 升序.

返回多于<N_Value>的记录

例如,以下查询按重量筛选出排名第一的产品:

  1. EVALUATE
  2. TOPN ( 1, Product, Product[Weight] )
复制代码


注意,这个查询有可能返回多行,因为如果有多个产品具有相同的重量,TOPN 函数将返回所有满足条件的行



7082211936381.jpeg


使用多列排序



你可以使用多列指定排序,以及每列顺序应该是降序(默认)还是升序,如下面的语法所示:

  1. TOPN (
  2.       <n_value>,
  3.       <table>,
  4.       <orderBy_expression>, <order>,
  5.       <orderBy_expression>, <order>,
  6.       [...]
  7. )
复制代码


<n_value>参数指定了从<table>返回的行数,其中<table>的排序由<orderBy_expression> 和<order>参数决定。支持多个<orderBy_expression>,如果第一个<orderBy_expression>在多个行都具有相同的值,那么第二个<orderBy_expression>将被计算,依此类推。<order>参数是 0 或 FALSE(默认值),表示按降序排序,1 或 TRUE 表示按升序排序。


你可以按重量和单价重写之前的查询排序,如下所示:

  1. EVALUATE
  2. TOPN ( 1, Product, Product[Weight],, Product[Unit Price] )
复制代码


在这种情况下,结果只有一行,但是你不能保证结果总是一行;在多行满足条件的情况下,函数会返回所有行。



7082211936382.jpeg



如果希望结果中包含准确的指定行数,就必须在 TOPN 参数中加入唯一列。例如,包含 ProductKey 列将检索 ProductKey 值最高的产品,以防所有其他排序表达式产生相同结果,如下面的查询所示:

  1. EVALUATE
  2. TOPN ( 1, Product, Product[Weight],, Product[Unit Price],, Product[ProductKey] )
复制代码
TOPN 并不保证返回的表按<order>参数排序,通常,结果都是乱序的。TOPN 仅从表中返回所有符合要求的记录而已

使用 FIRSTNONBLANK 将结果限定为单个行

时间智能函数章节,你已经看到 FIRSTNONBLANK 可用于FIRSTNONBLANK 从包含相同排名的集合中检索单个行,你可以将这种用法应用到 TOPN 返回的结果:

  1. EVALUATE
  2. FIRSTNONBLANK ( TOPN ( 1, Product, Product[Weight] ), 0 )
复制代码


正如你看到的,你可以在第二个参数中指定任何返回非空值的表达式(本例中使用常量值 0)。

TOPN 相关案例

DAX中如何实现动态TOPN and Others

假如我有非常多的成员,但是我只想按某个度量值展示其中TOP5结果,然后其它类别想汇总显示为其它,应该怎么做?

回复

使用道具 举报

LOVE1314 | 2021-4-24 13:51:54 | 显示全部楼层
说的不错,学习了
回复

使用道具 举报

水木 | 2021-6-16 17:31:27 | 显示全部楼层
锄禾日当午,发帖真辛苦。谁知坛中餐,帖帖皆辛苦!
回复

使用道具 举报

krkr111 | 2021-8-24 11:21:28 | 显示全部楼层
站位支持
回复

使用道具 举报

TKbbs | 2021-9-10 11:16:50 来自手机 | 显示全部楼层
小白一个 顶一下
回复

使用道具 举报

gege168 | 2021-9-15 09:12:33 | 显示全部楼层
加油站加油
回复

使用道具 举报

ylxt | 2021-9-23 19:21:35 来自手机 | 显示全部楼层
路过 帮顶 嘿嘿
回复

使用道具 举报

姑苏小子 | 2021-10-19 19:26:15 | 显示全部楼层
我了个去,顶了
回复

使用道具 举报

lynlyn | 2021-11-10 16:34:45 来自手机 | 显示全部楼层
努力学习中
回复

使用道具 举报

haishi369 | 2021-12-6 17:06:43 来自手机 | 显示全部楼层
顶起顶起顶起
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则