Qlik Sense:带筛选功能的十分位分析问题求助
Qlik分位数客户筛选&分位数固化解决方案
一、创建筛选器:选择整体的10%/20%/30%客户
要选全量客户里的TOP10%/20%/30%,核心是让分位数基准固定在全量数据上,不随前端筛选变化,两种实现方式:
办法1:脚本预先计算(推荐)
在数据加载脚本里直接给每个客户打上层级标签,标签基于全量数据生成,不会随筛选变动:
LOAD Customer, Sum(Profit) as CustomerProfit, // 给客户打TOP N%分组标签 If(CustomerProfit >= Fractile(TOTAL CustomerProfit, 0.9), 'TOP 10%', If(CustomerProfit >= Fractile(TOTAL CustomerProfit, 0.8), 'TOP 20%', If(CustomerProfit >= Fractile(TOTAL CustomerProfit, 0.7), 'TOP 30%', '其他'))) as CustomerTier RESIDENT 你的数据源表 GROUP BY Customer;
之后直接把CustomerTier字段拖到筛选面板,就能直接选择对应的客户群体。
办法2:前端创建计算维度(无需修改脚本)
不想动脚本的话,创建一个计算维度,强制用全量客户的利润计算分位数:
=Aggr( If(Sum(Profit) >= Fractile(TOTAL <Customer> Sum(Profit), 0.9), 'TOP 10%', If(Sum(Profit) >= Fractile(TOTAL <Customer> Sum(Profit), 0.8), 'TOP 20%', If(Sum(Profit) >= Fractile(TOTAL <Customer> Sum(Profit), 0.7), 'TOP 30%', '其他'))), Customer )
把这个计算维度添加到筛选面板,筛选时就是基于全量客户群体的结果。
二、解决筛选后分位数重算的问题
之前选10%客户后系统会重新拆分分位数,是因为原表达式的TOTAL会跟随当前筛选的子集计算。要解决这个问题,必须让分位数基准固定在全量数据上:
方案1:用脚本预计算的分位数等级
在脚本里给每个客户计算好基于全量数据的分位数等级(1=最高利润,10=最低):
LOAD Customer, CustomerProfit, // 先计算全量的分位数阈值 Fractile(TOTAL CustomerProfit, 0.1) as P10, Fractile(TOTAL CustomerProfit, 0.2) as P20, Fractile(TOTAL CustomerProfit, 0.3) as P30, ... Fractile(TOTAL CustomerProfit, 0.9) as P90, // 基于全量阈值计算分位数等级 If(CustomerProfit > P90, 1, If(CustomerProfit > P80, 2, If(CustomerProfit > P70, 3, ... If(CustomerProfit > P10, 9, 10)))) as DecileRank RESIDENT CustomerProfitTable;
后续筛选时,选DecileRank <=1对应TOP10%,<=2对应TOP20%,<=3对应TOP30%。就算筛选了这些客户,显示的等级还是基于全量数据的,不会重新拆分。
方案2:前端用TOTAL <ALL>强制全量计算
如果必须在前端表达式里修改,把原表达式中的TOTAL替换成TOTAL <ALL>,强制分位数永远基于全量客户的利润计算,不受筛选影响:
=Aggr( If(Sum(Profit) <= Fractile(TOTAL <ALL> Aggr(Sum(Profit), Customer), 0.1), 10, If(Sum(Profit) <= Fractile(TOTAL <ALL> Aggr(Sum(Profit), Customer), 0.2), 9, If(Sum(Profit) <= Fractile(TOTAL <ALL> Aggr(Sum(Profit), Customer), 0.3), 8, If(Sum(Profit) <= Fractile(TOTAL <ALL> Aggr(Sum(Profit), Customer), 0.4), 7, If(Sum(Profit) <= Fractile(TOTAL <ALL> Aggr(Sum(Profit), Customer), 0.5), 6, If(Sum(Profit) <= Fractile(TOTAL <ALL> Aggr(Sum(Profit), Customer), 0.6), 5, If(Sum(Profit) <= Fractile(TOTAL <ALL> Aggr(Sum(Profit), Customer), 0.7), 4, If(Sum(Profit) <= Fractile(TOTAL <ALL> Aggr(Sum(Profit), Customer), 0.8), 3, If(Sum(Profit) <= Fractile(TOTAL <ALL> Aggr(Sum(Profit), Customer), 0.9), 2, 1))))))))), Customer )
这样即使筛选了部分客户,显示的分位数层级还是全量数据的结果,不会把选中的10%客户再拆分成10份。
内容的提问来源于stack exchange,提问作者learnhowtocode
相关产品推荐
相关产品推荐

