如果说 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] )
使用 FIRSTNONBLANK 将结果限定为单个行
在时间智能函数章节,你已经看到 FIRSTNONBLANK 可用于半累加度量值。你还可以使用 FIRSTNONBLANK 从包含相同排名的集合中检索单个行,你可以将这种用法应用到 TOPN 返回的结果:
EVALUATE FIRSTNONBLANK ( TOPN ( 1, Product, Product[Weight] ), 0 )
正如你看到的,你可以在第二个参数中指定任何返回非空值的表达式(本例中使用常量值 0)。
“TOPN函数根”后面是不是少个”据”
[图片]