使用postgres和chart.io构建客户生命周期价值折线图

时间:2013-11-13 19:03:25

标签: sql postgresql charts

我需要构建一个客户生命周期价值图表,并坚持如何在普通psql中执行此操作。

a mockup on what it is supposed to look like

因此,我们的想法是每天都有一条线,显示当天签署的客户的平均金额。

我的表格如下:

用户

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

非常感谢

1 个答案:

答案 0 :(得分:1)

我确定您可以解决一些格式问题(here's the 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;