我有一个名为Orders的(简化)表,其中包含以下列:
OrderId,
PersonId
OrderDate
我想知道的是,表中有多少人在30天内完成了多个订单。例如,如果Bob在2015年1月21日订购了2015年1月21日的东西,然后在2015年1月21日订购了另外的东西,他将被列入名单,因为他在30天内订购了两件东西。
我一直在尝试整理SQL语句来做到这一点,但我不是很擅长这个并且似乎无法解决这个问题。
我正在使用SQL Server。
感谢您的帮助。
答案 0 :(得分:0)
Select PersonId, count(PersonId)
from Orders
where OrderDate <= '2015-01-31' and OrderDate >= '2015-01-01'
group by PersonId
having count(PersonId) > 1
答案 1 :(得分:0)
您可以尝试根据与订单相比较的订单中的相同客户和订单日期加入表格本身...
我会确保在桌子上有两个索引...... 您可能期望的范围的第一个日期(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日结束的3个条目。
但是现在,外部循环到达1月20日的记录,它在2月10日之后找到3个条目,包括2月10日......同样的人,但滚动30天。
类似于1月29日,然后是2月1日,但是在5月4日之前的30天之内没有任何关于2月10日之后的任何内容,并且5月4日之后没有任何内容在此之后没有任何内容。
现在,如果你只关心世界卫生组织,一旦你确认上述查询工作,你可能只想要那些总订单超过2 ...在45天内说3或更多?谁知道..只需添加一个HAVING COUNT(*)&gt; 2。
那应该仍然有用,但是现在,只需要那个人......忽略其余的列然后再做
Select distinct O.PersonID from ... rest of query