1

我需要建立一个客户生命周期价值图表,并被困在如何在普通的 psql 中做到这一点。

它应该是什么样子的模型

所以我们的想法是每天都有一条线,显示当天签署的客户随着时间的推移平均花费的金额。

我的表如下所示:

用户

id | created_at
1  | 2013-11-01
2  | 2013-11-02
3  | 2013-11-03
4  | 2013-11-03

收费

id | created_at | total_amount | user_id
1  | 2013-11-01 | 49.00        | 1
2  | 2013-11-01 | 22.00        | 1
3  | 2013-11-04 | 10.00        | 1
4  | 2013-11-02 | 49.00        | 2
5  | 2013-11-03 | 66.00        | 3
6  | 2013-11-03 | 49.00        | 4
7  | 2013-11-06 | 14.00        | 4
8  | 2013-11-12 | 33.00        | 4

我们需要使用 chart.io 将其呈现为折线图。因此结果表必须如下所示:

created_at | Layer      | avg_amount
2013-11-01 | 2013-11-01 | 35.50
2013-11-04 | 2013-11-01 | 10.00
2013-11-02 | 2013-11-02 | 49.00
2013-11-03 | 2013-11-03 | 57.50
2013-11-06 | 2013-11-03 | 14.00
2013-11-12 | 2013-11-03 | 33.00

“创建于”是指收费的时间

“层”是指创建用户的时间

'avg_amount' 是在 'created_at' 上注册的用户当天的平均总费用

谢谢 :)

编辑:不幸的是,随着营销人员看到图表,规格发生了变化……他们现在希望 Y 轴永远不会下降。它需要是[从同类用户中创造的总收入]/[同类群组中的所有用户]。因此,分母可以增加,但分母永远不能减少。

所以结果表应该如下所示:

created_at | Layer      | cumulative_amount
2013-11-01 | 2013-11-01 | 71.00
2013-11-02 | 2013-11-02 | 49.00
2013-11-03 | 2013-11-03 | 66.00
2013-11-03 | 2013-11-03 | 49.00
2013-11-04 | 2013-11-01 | 81.00
2013-11-06 | 2013-11-03 | 63.00
2013-11-12 | 2013-11-03 | 96.00

非常感谢

4

1 回答 1

1

我相信您可以解决一些格式问题(这里是 SQLFiddle),但这是您想要的基本查询。

WITH daily_charges AS (
  SELECT
    sum(total_amount) AS daily_total,
    user_id,
    date_trunc('day', created_at) AS charge_date
  FROM charges
  GROUP BY user_id, created_at
  )
SELECT
  d.charge_date,
  date_trunc('day', u.created_at) AS layer,
  avg(d.daily_total) AS avg_amount
FROM
  daily_charges d
  JOIN users u ON
    (d.user_id=u.id)
GROUP BY charge_date, layer;
于 2013-11-13T20:08:51.113 回答