【问题标题】:Daily consumption delta based on purchase dates基于购买日期的每日消费增量
【发布时间】:2018-10-30 19:16:52
【问题描述】:

我需要制作一个 (Tableau) 每日图表,描述与前一天相比的消费动态,按消费增加、消费减少和总体净变化的客户分组。示例如下。

样本计算逻辑:每个客户的每一天计算该客户与前一天的差异,将大于0的相加,将小于0的相加,相加。

样本是根据相对较小的数据集手动制作的。 真实的表有超过 200 万行,并且不是很一致,因为客户在不同的日子开始购买,可能会跳过不同的时期什么都不买。 初始表结构是这样的:

client_id   date    sales
    1   2018-09-01  4
    1   2018-09-02  5
    1   2018-09-04  3
    2   2018-09-1   2
    2   2018-09-2   2

虽然计算每个日期的表差很简单,但计算纯增长和纯流失却很难,因为日期行并非对所有客户都是连续的。 我想在从数据存储加载初始数据集时将 delta_to_previous 列添加到每一行,例如:

WITH orders AS (
    SELECT client_id,
           date,
           SUM(sales) as sales
    FROM dwh_orders
    GROUP BY client_id, date
)
SELECT
    client_id, 
    date, 
    sales,
    LAG(sales, 1) OVER (
        PARTITION BY client_id
        ORDER BY date
    ) as prev_date_order_value,
    sales - LAG(sales, 1) OVER (
        PARTITION BY client_id
        ORDER BY date
    ) as prev_date_order_delta
FROM 
    orders;

然后对于每个日期,我可以只显示正值、负值、总计的总和。

问题,这种方法会在下一个购买日显示消费变化,如果客户在 3 月 1 日购买了 5 件商品,然后在 5 月 1 日购买了 5 件商品,他将完全没有变化。它应该做的是在 3 月 2 日显示 -5,在 5 月 1 日显示 +5。

我对解决此问题的最佳方法感到有些困惑。一般的解决方案也可能使用一些评论。

如果有人处理过类似的问题,我真的可以采纳你的建议。 如果您对 sql 有经验,我可以使用您的建议,了解如何将初始数据集(参见上面的示例)转换为类似

client_id   date    sales delta
    1   2018-09-01  4   0
    1   2018-09-02  5   1
    1   2018-09-03  0   -5
    1   2018-09-04  3   3
    2   2018-09-1   2   0
    2   2018-09-2   2   0

如果您对 Tableau 有所了解,我可以帮助您使用它的工具构建这样的图表。

【问题讨论】:

  • 您希望每天都在结果中吗?你能总结一下你要的是什么吗?目前还不清楚。另外:您使用的是 MySQL 8 还是更早的版本?
  • @Used_By_Already 我不需要每天,Tableau 可以在端点之间建立连续轴。我确实需要没有旅行的日子,但昨天有。 MySQL 8,是的。我想我不确定这件事的最有效方法。尝试过 3 年来的每一天,每天的销售额都通过完全连接与昨天的销售额相结合,但到目前为止,这样计算似乎需要 8 小时。可能有一种我想念的简单方法。

标签: mysql sql tableau-api


【解决方案1】:
with cdates as (
      select client_id, min(date) as dte, max(date) as maxd
      from dwh_orders
      group by client_id
      union all
      select client_id, dateadd(day, 1, dte), maxd
      from cdates
      where dte < maxd
     ),
     cd as (
      select client_id, date, sum(sales) as sales
      from dwh_orders
      group by client_id, date
    )
select cdates.client_id, cdates.date,
       coalesce(sales, 0) as sales,
       (coalesce(sales, 0) -
        lag(coalesce(sales, 0)) over (partition by cdates.client_id order by cdates.date
       ) as delta
from cdates left join
     cd
     on cdates.client_id = cd.client_id and
        cdates.date = cd.date
option (maxrecursion 0);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 2014-08-03
    相关资源
    最近更新 更多