带时长的指标解决方案

场景说明

指标在计算时,需要根据问答的时长不同,动态传入不同参数,如:复购场景中,有购买后7天内再次购买的用户、有买后30天再次购买的用户等情况。在计算某时间范围的7日复购,或者1月复购时,就需要根据提问的不同,对用户动态打上不同的标签,从而进行计算。

期望行为

提问期望结果
本月7日复购率是多少?本月间隔七天内,有购买多次的人数占本月购买人数的多少?
去年三个月复购人数是多少?去年,从购买到再次购买间隔3个月以内的用户数

解决方案

复购率为例

系统中定义了自定义指标:

(lf, _v1, config, {execute}) => {
  let day = 30;

  if(lf.preds[0].params) {
    day = Math.round(lf.preds[0].params[0].value / 86400)
  }
  
  const newLF = {
    schema: 'sales',
    from: {
      ...lf,
      preds: [
        {'pred': '用户'},
        {
      name: 'rpuser',
      operator: '$sql',
      type: 'string',
      pred: `if(count(1) OVER (PARTITION BY user ORDER BY toDate(timestamp) Range BETWEEN 1 FOLLOWING AND ${day} FOLLOWING) > 0, user, NULL)`,
          }
      ]
    },
    preds: [{
      name: lf.preds[0].name,
      operator: '$sql',
      type: 'percentage',
      pred: 'uniqExact(rpuser) / uniqExact(`用户`)',
    }]
  }
  
  return execute(newLF, config);
}

问答节点定制化添加:

此为固定代码,不对外自由更改,只要将复购率改为对应指标即可。

(self, toCombine, position, graph, stage, { isValNode }) => {
  if (isValNode(toCombine) && toCombine._val.type === "duration") {
    const combined = graph.deepcloneNode(self);
    combined.preds = [
      {
        operator: "复购率",
        params: [
          {
            value: toCombine._val.value,
            scale: toCombine._val.scale,
            granularity: toCombine._val.granularity,
          },
        ],
      },
    ];
    delete combined._slots;
    return combined;
  }
  return null;
}

计算核心

系统根据问答,自动计算七日、3各月的params,”问答节点定制化“的代码就是给logicform添加一个params,将params作为一个动态参入,传入js参与计算。