【问题标题】:SQL : finding people that have made more than one order within a 30 day periodSQL : 查找在 30 天内下过多个订单的人
【发布时间】:2015-03-11 20:43:15
【问题描述】:

我有一个名为 Orders 的(简化的)表,其中包含以下列:

OrderId,
PersonId
OrderDate

我想了解的是,表中有多少人在 30 天内下了超过一份订单。例如,如果 Bob 在 2015 年 1 月 3 日订购了某样东西,然后在 2015 年 1 月 21 日又订购了另一样东西,那么他将被包含在列表中,因为他在 30 天内订购了两件东西。

我一直在尝试将 SQL 语句放在一起来执行此操作,但我不太擅长此操作,似乎无法弄清楚。

我正在使用 SQL Server。

感谢您的帮助。

【问题讨论】:

  • 您是否只是在寻找一个固定的 30 天期限,或者例如在一整年中,有没有人在另一个人的 30 天内订购?
  • 对不起,可能应该指定。寻找全年。
  • 那么我的答案应该完全符合您的要求,只需更新您要查找的年份范围的 WHERE 子句。

标签: sql sql-server


【解决方案1】:

您可以尝试根据相同的客户和订单日期在被比较的订单后 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

【讨论】:

  • 完美!感谢您不仅给出答案,还提供解释,以便我了解这是如何工作的。
  • @meyousikmann,没问题。我更喜欢给出解释,而不仅仅是 SQL 答案……如果您了解其背后的机制,您可以将类似的方法应用于其他未来的查询……这样更多人可以阅读并且……哦,我现在明白了...时刻。
【解决方案2】:
Select PersonId, count(PersonId)
from Orders 
where OrderDate <= '2015-01-31' and OrderDate >= '2015-01-01' 
group by PersonId 
having count(PersonId) > 1

【讨论】:

  • 这不是他们要找的...不仅仅是 30 天内的计数,而是超过一年的时间,任何在 30 天内的订单...例如 3 月 15 日, 2014 年至 2014 年 4 月 7 日之间有资格在 30 天内相互间隔。
猜你喜欢
  • 2021-12-08
  • 2013-07-08
  • 1970-01-01
  • 2016-07-01
  • 2014-03-29
  • 1970-01-01
  • 1970-01-01
  • 2020-05-12
  • 2023-03-11
相关资源
最近更新 更多