从数据到信息
从信息到洞察

理解 TOPN

如果说 RANKX 适合计算明细的名次数据,那么 TOPN 则可以批量返回结果,从一张表中返回所有满足条件的前 N 行记录。

TOPN

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>的记录

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

EVALUATE
TOPN ( 1, Product, Product[Weight] )

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

使用多列排序

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

TOPN ( 
      <n_value>, 
      <table>, 
      <orderBy_expression>, <order>,
      <orderBy_expression>, <order>,
      [...]
)

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

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

EVALUATE
TOPN ( 1, Product, Product[Weight],, Product[Unit Price] )

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

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

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

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

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

EVALUATE
FIRSTNONBLANK ( TOPN ( 1, Product, Product[Weight] ), 0 )

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

TOPN 相关案例

说点什么

1000
 
鼓掌微笑开心憧憬爱你色并不觉得吃瓜doge二哈喵喵思考笑哭捂脸悲伤大哭抓狂汗偷笑打脸捂眼黑线问号晕拜拜闭嘴衰咒骂ok作揖
  订阅本文评论  
提醒
DAX 圣经

导读

初识 DAX

DAX 基础知识

DAX 原理

DAX 高级原理

基础函数类型

迭代函数

CALCULATE 函数

CALCULATE 调节器

基础表函数

条件判断函数

查找匹配函数

时间智能函数

统计类函数

投影函数

分组/连接函数

集合函数

其他函数