TOPN函数也是必须掌握的函数,它可以返回指定表按指定条件进行排序后的前N行,经常用于计算头部产品或客户等分析场景。
语法和作用
语法:
TOPN(n_value, table, orderBy_expression, [order[, orderBy_expression, [order]]…])
作用:
根据第三参数定义的一个或多个表达式的结果对第二参数的表进行排序,并从排序后的表中返回由第一参数定义的前N行数据。
参数说明:
1、n_value,需要返回的前N行的行数,在外部计值环境中计值
2、table,从中返回前N行的表表达式,在外部计值环境中计值
3、orderBy_expression,可选可重复,用于对第二参数的表进行排序,在外部计值环境与第二参数的表的行上下文里计值
4、order,可选可重复,用于指定升序或降序,降序为:0或DESC,升序为:1或ASC,默认降序排列。
注意事项:
1、当TOPN函数的第一参数为0或负数时,将返回空表。
2、第三参数的排序表达式在排序时采用的是SKIP的样式,因此如果返回的结果中存在重复值,即存在并列排名的情况,那么TOPN函数最终返回的行数可能会大于第一参数定义的行数。
3、TOPN函数最终返回的前N行数据并不会保持排序,其返回结果通常是乱序的。
辅助理解的例子
1、对产品表按序号字段升序排序,然后返回前5行数据,如下图所示:
从上面的返回结果也可以看到,虽然返回了前5行的数据,但是最终返回的结果是乱序的,这就是注意事项里提到的:TOPN函数最终返回的前N行数据并不会保持排序。
2、当要返回的前N行的行数为0或负数时,TOPN函数会返回一个空表,如下图所示:
3、当第三参数的排序表达式的结果有重复值,即存在并列排名时,那么TOPN函数最终返回的行数可能会大于第一参数定义的行数,如下图所示:
4、当排序表达式有重复值时,可以考虑增加排序的条件,从而使表中每一行的排名都不同,从而可以刚好返回所需的N行数据。如下图所示:
5、TOPN函数的作用可以用其他函数来实现,其等价写法如下:
TOPN(N,table,orderBy_expression,ASC)
等价于:
VAR N = xx
RETURN
FILTER(
table
RANKX(table,orderBy_expression,,ASC,SKIP)<=N
)
// 该等价写法只在TOPN函数只有单个排序表达式时成立
6、使用TOPN函数实现产品的TopN和Others的类别划分,如下图所示:
总结
TOPN函数是一个简单但功能强大的函数,能够快速获取表中最重要的记录,是必须掌握的一个函数。