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