您可以尝试根据相同的客户和订单日期在被比较的订单后 30 天内加入表本身...
我会确保表上有两个索引...
首先按您可能期望的范围的日期(OrderDate)
第二个基于(PersonID、OrderID、OrderDate)为给定的人获取连续的加入基础。
select
O.PersonID,
O.OrderDate,
O.OrderID,
MAX( O2.OrderDate ) as LastOrderDate,
COUNT(*) as TotalOrders
from
Orders O
JOIN Orders O2
on O.PersonID = O2.PersonID
AND O.OrderID < O2.OrderID
AND O2.OrderDate < DATEADD( day, 30, O.OrderDate);
where
O.OrderDate > '2014-01-01'
group by
O.PersonID,
O.OrderDate,
O.OrderID
现在,因为这是一个 JOIN(不是左连接),它保证同一个人存在另一个订单,但高于基于主查询“O”别名的订单,但仅限于 30 天内的原始 O.OrderDate。
现在,这可能会为一个人创建多个实例,例如一个人在 1 月 1 日、1 月 20 日、1 月 29 日、2 月 1 日、2 月 10 日、5 月 4 日购买的示例,因为
从 1 月 1 日的原始订单开始,这将包含 3 个在 1 月 29 日结束的条目。
但是现在,外部循环到达 1 月 20 日的记录,它会在它之后找到 3 个条目,直到 2 月 10 日(包括 2 月 10 日)......同一个人,但滚动 30 天。
1 月 29 日和 2 月 1 日类似,但在 5 月 4 日之前的 30 天内将不会有 2 月 10 日的条目,因为在它之后没有任何条目,5 月 4 日之后没有条目。
现在,如果您只关心 WHO,一旦您确认上述查询会起作用,您可能只想要总订单数超过 2 的那些...比如 45 天内 3 或更多?谁知道.. 只需添加一个 HAVING COUNT(*) > 2。
这应该仍然有效,但现在,只得到那个人......忽略其余的列,然后做
Select distinct O.PersonID from ... rest of query