PowerBI:在聚合表中按最小粒度计算中位数、Q1和Q3
PowerBI 计算带权重的批次-区域维度下仪表年龄中位数、Q1/Q3
针对你在聚合表中需要按部门区域+批次维度,计算带仪表数量权重的年龄中位数、Q1、Q3的需求,普通MEDIAN函数无法处理权重问题,可通过以下DAX度量值实现:
先定义基础度量值
总仪表数 = SUM('仪表聚合表'[仪表数量])
1. 仪表年龄中位数
仪表年龄中位数 = VAR 总数量 = [总仪表数] VAR 半数 = 总数量 / 2 VAR 排序年龄累计 = ADDCOLUMNS( SUMMARIZE('仪表聚合表', '仪表聚合表'[安装后使用年限]), "@累计数量", CALCULATE( SUM('仪表聚合表'[仪表数量]), FILTER( ALLSELECTED('仪表聚合表'[安装后使用年限]), '仪表聚合表'[安装后使用年限] <= EARLIER('仪表聚合表'[安装后使用年限]) ) ) ) VAR 中位数候选 = MINX( FILTER(排序年龄累计, [@累计数量] >= 半数), '仪表聚合表'[安装后使用年限] ) VAR 前一位候选 = MAXX( FILTER(排序年龄累计, [@累计数量] < 半数), '仪表聚合表'[安装后使用年限] ) RETURN IF( MOD(总数量, 2) = 0, (中位数候选 + 前一位候选) / 2, 中位数候选 )
2. 仪表年龄Q1(下四分位数)
仪表年龄Q1 = VAR 总数量 = [总仪表数] VAR Q1阈值 = 总数量 * 0.25 VAR 排序年龄累计 = ADDCOLUMNS( SUMMARIZE('仪表聚合表', '仪表聚合表'[安装后使用年限]), "@累计数量", CALCULATE( SUM('仪表聚合表'[仪表数量]), FILTER( ALLSELECTED('仪表聚合表'[安装后使用年限]), '仪表聚合表'[安装后使用年限] <= EARLIER('仪表聚合表'[安装后使用年限]) ) ) ) VAR Q1候选 = MINX( FILTER(排序年龄累计, [@累计数量] >= Q1阈值), '仪表聚合表'[安装后使用年限] ) VAR 前一位候选 = MAXX( FILTER(排序年龄累计, [@累计数量] < Q1阈值), '仪表聚合表'[安装后使用年限] ) RETURN IF( MOD(总数量, 4) = 0, (Q1候选 + 前一位候选) / 2, Q1候选 )
3. 仪表年龄Q3(上四分位数)
仪表年龄Q3 = VAR 总数量 = [总仪表数] VAR Q3阈值 = 总数量 * 0.75 VAR 排序年龄累计 = ADDCOLUMNS( SUMMARIZE('仪表聚合表', '仪表聚合表'[安装后使用年限]), "@累计数量", CALCULATE( SUM('仪表聚合表'[仪表数量]), FILTER( ALLSELECTED('仪表聚合表'[安装后使用年限]), '仪表聚合表'[安装后使用年限] <= EARLIER('仪表聚合表'[安装后使用年限]) ) ) ) VAR Q3候选 = MINX( FILTER(排序年龄累计, [@累计数量] >= Q3阈值), '仪表聚合表'[安装后使用年限] ) VAR 前一位候选 = MAXX( FILTER(排序年龄累计, [@累计数量] < Q3阈值), '仪表聚合表'[安装后使用年限] ) RETURN IF( MOD(总数量, 4) = 0, (Q3候选 + 前一位候选) / 2, Q3候选 )
关键逻辑说明
- 通过
SUMMARIZE合并同一维度下的重复年龄,避免重复计算 ALLSELECTED确保计算范围限定在当前矩阵的部门区域+批次上下文内,不受其他筛选器干扰- 基于累计数量阈值(半数/25%/75%)定位分位数,同时处理奇偶数量的边界情况
内容的提问来源于stack exchange,提问作者vicvin
相关产品推荐
相关产品推荐

