如何在Power BI中复现Spotfire的窗口聚合查询逻辑
实现方案说明
原逻辑拆解
原Spotfire表达式逻辑:对每行数据,若
[Duplicates] = 1,则返回该行对应[week]、[client_name]、[survey_type]、[category]四个维度分组下的所有[nps]求和结果,否则返回空值。属于带筛选条件的分区聚合计算。
方案1:DAX计算列实现(推荐)
该方案和Spotfire行级别计算逻辑完全匹配,适合需要保留动态计算能力的场景,直接在表中新建计算列即可:
nps_group_sum = IF( [Duplicates] = 1, CALCULATE( SUM('你的表名'[nps]), ALLEXCEPT('你的表名', '你的表名'[week], '你的表名'[client_name], '你的表名'[survey_type], '你的表名'[category]) ), BLANK() )
逻辑说明:
IF([Duplicates] = 1, xxx, BLANK())对应原逻辑的Case When分支判断,BLANK()在Power BI中等同于空值ALLEXCEPT作用是清除表的其他筛选上下文,仅保留四个指定分组字段的筛选,完全对应Spotfire中OVER(分组字段)的分区效果CALCULATE会把当前行上下文的四个分组字段值转换为筛选上下文,最终计算出对应分组的nps总和
方案2:Power Query M实现(数据加载阶段预计算)
如果希望在数据清洗阶段就固定计算结果,不需要后续动态调整,可在Power Query中实现,适合数据量较大的场景,性能更优:
let // 替换下方"原始表"为你自己的数据源引用名称 源 = 原始表, // 按四个维度分组计算每组nps总和 分组求和 = Table.Group(源, {"week", "client_name", "survey_type", "category"}, {{"group_total", each List.Sum([nps]), type number}}), // 把分组求和结果合并回原表 合并映射 = Table.NestedJoin(源, {"week", "client_name", "survey_type", "category"}, 分组求和, {"week", "client_name", "survey_type", "category"}, "temp", JoinKind.LeftOuter), 展开结果 = Table.ExpandTableColumn(合并映射, "temp", {"group_total"}, {"group_total"}), // 按Duplicates字段判断返回值 新增结果列 = Table.AddColumn(展开结果, "nps_group_sum", each if [Duplicates] = 1 then [group_total] else null, type number) in 新增结果列
内容的提问来源于stack exchange,提问作者Ebenezer Okeowo
相关产品推荐
相关产品推荐

