【问题标题】:Find amount sold to "reactivated" customers查找出售给“重新激活”客户的金额
【发布时间】:2020-11-25 23:16:04
【问题描述】:

我正在尝试获得以下信息: 客户列表以及在初始日期和最终日期(称为 D1 和 D2)之间向他们销售的金额 ($) 如果满足以下条件:上一次销售到 D1 之间的第一次销售之间的时间并且 D2 大于某个量 X。


例子:

D1 = 2020 年 1 月 1 日,D2 = 2020 年 12 月 31 日,X = 1 年。

客户 John 在 2020 年的首次购买是在 2020 年 1 月 15 日,而他之前的购买是在 2019 年 5 月 15 日。因此,John 不应出现在列表中(因为这两个日期之间相隔不到一年)。

客户 Bob 在 2020 年的第一次购买是在 2020 年 2 月 15 日,而他之前的购买是在 2019 年 1 月 10 日。Bob 应该连同在 D1 和 D2 之间出售给他的总金额一起出现在列表中.


我已尝试使用max() 来查找最后完成购买的日期,条件是它在 D1 之前。比如:

select max(date)
from Sales
where date<:D1

显然我可以做类似的事情(通过min())来找到 D1 之后的第一个购买日期。但是我如何同时做这两件事呢?

欢迎提出任何想法!

【问题讨论】:

  • 一些样本数据和预期结果会澄清。

标签: sql sql-server tsql


【解决方案1】:

您可以将条件逻辑与窗口函数一起使用。以下是伪代码,因为您的问题甚至没有正确命名数据中的列。但是,应该很容易理解:

select customer, sum(amount)
from (select t.*,
             max(case when date < @d1 then date end) over (partition by customer) as pre_date,
             min(case when date >= @d1 then date end) over (partition by customer) as post_date
      from t
     ) t
where pre_date < dateadd(year, -1, post_date) and
      date >= @d1 and
      date <= @d2
group by customer;

【讨论】:

  • 哇,它做到了(这里和那里有一些调整)!你太棒了,伙计,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
  • 2015-01-18
  • 2015-12-29
相关资源
最近更新 更多