【发布时间】: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