如何使用M或DAX批量生成120个可重叠的预设价格集群/分桶
完全可以通过少量代码实现,不需要手动录入120个集群的定义,M和DAX两种语言都有对应的解决方案,具体实现方式如下:
M语言实现方案(Power Query端)
适合需要在数据加载、清洗阶段就完成分桶绑定的静态场景,运行后直接生成带分桶标签的产品表。
你只需要修改开头的自定义参数即可适配你的实际分桶规则,代码示例如下:
let // ========== 自定义参数,可根据你的需求修改 ========== 起始价格 = 0, 单桶价格覆盖宽度 = 20, 相邻桶步长 = 10, // 步长小于单桶宽度即可实现重叠效果 总桶数 = 120, 源产品表 = 你的产品表名称, // 替换为你自己的产品表引用名 产品价格列名 = "产品价格", // 替换为你表中存储价格的列名 // ========== 以下代码无需手动修改 ========== // 自动生成120个价格桶规则 生成桶规则 = List.Generate( () => 0, (x) => x < 总桶数, (x) => x + 1, (x) => [ 桶ID = x + 1, 桶名称 = "价格集群" & Text.From(x + 1) & "(" & Text.From(起始价格 + x * 相邻桶步长) & "-" & Text.From(起始价格 + x * 相邻桶步长 + 单桶价格覆盖宽度) & ")", 最低价格 = 起始价格 + x * 相邻桶步长, 最高价格 = 起始价格 + x * 相邻桶步长 + 单桶价格覆盖宽度 ] ), 价格桶规则表 = Table.FromList(生成桶规则, Record.FieldValues, {"桶ID", "桶名称", "最低价格", "最高价格"}), // 给产品匹配所有符合条件的价格桶(支持重叠匹配) 匹配分桶 = Table.AddColumn(源产品表, "所属价格集群", (product) => Table.SelectRows(价格桶规则表, each Record.Field(product, 产品价格列名) >= [最低价格] and Record.Field(product, 产品价格列名) < [最高价格])[桶名称] ), // 若需要一个产品对应多个分桶的多行结构,保留下方展开步骤;若需要多标签合并为一列,可删除展开步骤改用List.Join处理 展开分桶列 = Table.ExpandListColumn(匹配分桶, "所属价格集群") in 展开分桶列
DAX实现方案(数据模型端)
适合需要动态调整分桶规则、需要用分桶做维度切片分析的场景,不需要刷新数据源即可修改分桶规则。
步骤1:新建计算表生成价格桶规则
价格桶表 = VAR 起始价格 = 0 VAR 单桶价格覆盖宽度 = 20 VAR 相邻桶步长 = 10 VAR 总桶数 = 120 RETURN SELECTCOLUMNS( GENERATESERIES(1, 总桶数, 1), "桶ID", [Value], "桶名称", "价格集群" & [Value] & "(" & 起始价格 + ([Value]-1)*相邻桶步长 & "-" & 起始价格 + ([Value]-1)*相邻桶步长 + 单桶价格覆盖宽度 & ")", "最低价格", 起始价格 + ([Value]-1)*相邻桶步长, "最高价格", 起始价格 + ([Value]-1)*相邻桶步长 + 单桶价格覆盖宽度 )
步骤2:产品表新增计算列匹配分桶
如果需要合并显示所有匹配的分桶标签,用如下代码:
所属价格集群 = CONCATENATEX( FILTER('价格桶表', '产品表'[产品价格] >= '价格桶表'[最低价格] && '产品表'[产品价格] < '价格桶表'[最高价格]), '价格桶表'[桶名称], "," )
如果需要用价格桶做维度切片,直接给价格桶表和产品表建立多对多关系即可。
内容的提问来源于stack exchange,提问作者David Lydike
相关产品推荐
相关产品推荐

