【发布时间】:2017-10-17 14:31:37
【问题描述】:
我有下表,除了黄色的列之外的所有列
基本上,该表包含客户的 ID、销售发生的日期以及客户当天花费的总金额(销售额)。现在我必须计算当天每个客户在一个时间范围内的累计销售额,包括当天的销售额。例如,将时间范围设置为 3 天客户 2233 购买了两次(14 日没有购买),因此他 15 日的累计销售额为 26,而 13 日为 25。
我无法创建新表,所以我尝试了这种方法,但速度很慢
SELECT t.dt,
Count(CASE WHEN t.running_sale < 1.99 THEN 1 ELSE NULL END) as "Low spender",
Count(CASE WHEN t.running_sale BETWEEN 1.99 and 4.99 THEN 1 ELSE NULL END) as "Medium spender",
Count(CASE WHEN t.running_sale > 4.99 THEN 1 ELSE NULL END) as "High spender"
FROM ( SELECT dt, channel, id, (
SELECT SUM(revenue)
FROM myTable rd
WHERE CAST(rd.dt AS DATE)
BETWEEN (CAST(rd.dt AS DATE) - INTERVAL '3' DAY) AND CAST(rd.dt AS DATE) AND
rd.id = r.id
) running_sale from myTable r) t
WHERE channel = 'retail'
AND dt BETWEEN '2017-06-01' AND '2017-06-15'
GROUP BY dt
limit 100
【问题讨论】:
-
使用分析?
sum(Sales) OVER (PARTITION by ID ORDER BY Date asc ROWS BETWEEN 2 PRECEDING ) as RunningSales -
不起作用,因为将在第 12 天占用 ID 2233 将占用 11 和 06,这是超过 3 天的差距。
-
我有点明白,但我不明白为什么 2233 在 15 日有 26,那么如果范围是 3 天前(包括 15、14、13),这将给出 22 而不是 26。或者应该包含第 12 个,所以范围是 15,13,13,12?
-
RexTester:对于那些想尝试它的人:rextester.com/BJE9775 和我的失败尝试)我想我们可以将它加入一个数字表,这样所有日期都包括在内,计算出正在运行的销售额并过滤掉那些0 美元的销售额...
-
不要过分关注示例,而应关注描述。我是手动完成的,这是一个错字:D
标签: sql postgresql