X 在一年的连续 7 天 window 内的第一个实例
First instance of X within a rolling 7 day window for a year
我试图找到客户在 7 天内遇到错误的第一个实例 window。我打算用它来查看客户在接下来几天的行为,例如他们是下订单,还是在返回站点之前有很长一段时间。
所以我想要得到的是 table,其中包含:
Customer, Date, ReceiptID
Jack, 07/05/2018 , 223A
这是 7 天内的第一个实例 window。然后他在 09/05/2018 再次遇到该错误,我们不计算在内,因为它是在第一次遇到错误后的 7 天内。
然后他在 2018 年 8 月 18 日遇到了一个错误,我想将其包含在我的结果中。
考虑到客户理论上可能在 7 天内遇到超过 30 个错误 window,是否可以在 SQL 服务器中简单地执行此操作?
您可以使用 lag()
从上一个报告中获取 7 天以上的报告:
select b.*
from (select b.*,
lag(date) over (partition by customer order by date) as prev_date
from bugs b
) b
where prev_date is null or prev_date < dateadd(day, -7, date);
请注意,如果您有诸如 1-6-12-18-24 之类的序列,那么这将算作一个“7 天”时间段,因为这些报告没有更大的间隔。
我试图找到客户在 7 天内遇到错误的第一个实例 window。我打算用它来查看客户在接下来几天的行为,例如他们是下订单,还是在返回站点之前有很长一段时间。
所以我想要得到的是 table,其中包含:
Customer, Date, ReceiptID
Jack, 07/05/2018 , 223A
这是 7 天内的第一个实例 window。然后他在 09/05/2018 再次遇到该错误,我们不计算在内,因为它是在第一次遇到错误后的 7 天内。
然后他在 2018 年 8 月 18 日遇到了一个错误,我想将其包含在我的结果中。
考虑到客户理论上可能在 7 天内遇到超过 30 个错误 window,是否可以在 SQL 服务器中简单地执行此操作?
您可以使用 lag()
从上一个报告中获取 7 天以上的报告:
select b.*
from (select b.*,
lag(date) over (partition by customer order by date) as prev_date
from bugs b
) b
where prev_date is null or prev_date < dateadd(day, -7, date);
请注意,如果您有诸如 1-6-12-18-24 之类的序列,那么这将算作一个“7 天”时间段,因为这些报告没有更大的间隔。