如何编写DAX查询按区域获取各区域Top N关键字(按值降序)
实现按区域分组获取Top N关键字的DAX查询
需求说明
- 按区域(A/B/C/D)分别获取每个区域内的Top N个关键字
- 按数值(value)降序排序,示例为各区域取Top 100
原代码问题分析
你提供的参考代码是全局范围内取Top 100,没有按区域分组,无法实现每个区域单独筛选Top N的需求。
正确DAX查询方案
方案1:分组返回嵌套结果
如果需要按区域分组,每个区域下直接展示对应的Top N关键字集合,可以用GROUPBY实现:
EVALUATE GROUPBY ( '你的数据表', '你的数据表'[region], "@Top100关键字", TOPN ( 100, CURRENTGROUP(), '你的数据表'[value], DESC ) )
说明:
GROUPBY按region字段分组CURRENTGROUP()指代当前区域的所有记录- 对每个区域内的记录用
TOPN筛选出value降序的前100条
方案2:展开为扁平化结果
如果需要将每个区域的Top 100关键字逐条展示(每条记录包含区域、关键字、数值),可以用排名过滤的方式:
EVALUATE VAR TargetTopN = 100 RETURN FILTER ( ADDCOLUMNS ( SUMMARIZECOLUMNS ( '你的数据表'[region], '你的数据表'[key], '你的数据表'[value] ), "@区域内排名", RANKX ( CALCULATETABLE ( SUMMARIZECOLUMNS ( '你的数据表'[key], '你的数据表'[value] ), ALLEXCEPT ( '你的数据表', '你的数据表'[region] ) ), '你的数据表'[value],, DESC, DENSE ) ), [@区域内排名] <= TargetTopN ) ORDER BY '你的数据表'[region], [@区域内排名]
说明:
- 用
VAR定义TargetTopN,方便修改需要的Top数量 RANKX计算每个关键字在所属区域内的排名(按value降序)FILTER筛选出排名≤100的记录,最后按区域和排名排序
注意事项
- 请将代码中的
'你的数据表'替换为实际使用的表名称 - 若需要处理value重复的情况,
RANKX的最后一个参数DENSE会让相同value的记录获得相同排名;如果需要每个记录唯一排名,可改为SKIP
内容的提问来源于stack exchange,提问作者Alon_T
相关产品推荐
相关产品推荐

