查找StartDate和EndDate之间的重叠,以查看同一天是否有超过3次出现

时间:2013-01-18 23:16:06

标签: sql sql-server-2008 tsql

所以我在SQL SERVER 2008中有一个表有一个itmes列表。一个人每天最多只能订购4件商品。所以我想知道在任何开始日期或结束日期是否有一个时间,他们有超过4项目的特定日期。

以下是我的表格示例:

OrderNo  Item     quantity   StartDate   EndDate
112      xbox        2       2012-12-05  2012-12-10
123      tv          1       2012-12-06  2012-12-07
125      computer    4       2012-12-10  2012-12-11
165      game        1       2012-12-06  2012-12-10
186      toy         2       2012-12-02  2012-12-04

所以从这张桌子我们可以看到他们每天有超过4件物品......现在我需要知道他们有多少物品以及他们有多于4件物品的天数。

基本上我想检查项目何时退出和返回时间的重叠日期,以查看特定日期是否同时有超过4个项目。

我不知道如何处理这个问题。我在SQL中查看了许多重叠的日期和范围。

2 个答案:

答案 0 :(得分:1)

您需要一张日历表。理想情况下,这是在master数据库中设置的永久性表,所有表格都已正确编入索引,但您可以动态创建它,如:

WITH Calendar
AS
(
    SELECT MIN(StartDate) AS Today
          ,MAX(EndDate) AS LastDay
    FROM table
    UNION ALL
    SELECT DATEADD(day,1,Today)
          ,LastDay
    FROM Calendar
    WHERE Today<LastDay
)

注意:您的正常最大递归为100,因此除非您添加OPTION (MAXRECURSION n),其中n是小于32768的int,否则您可以获得的最大值为100天。

您现在有一张表可以加入原始表格,涵盖所有相关日期,如此

SELECT Today
      ,SUM(Quantity) AS ItemCount
FROM Calendar c
     INNER JOIN 
     Table t ON c.Today BETWEEN t.StartDate AND t.EndDate
GROUP BY Today
HAVING SUM(Quantity)>4

请参阅此SQL Fiddle

SQL fiddle为解决方案提供了“永久性”日历表。

答案 1 :(得分:0)

这个使用运行总计来汇总每个日期订购的项目。要检查任何日期(未在示例数据中给出),只需使用此结果并进行一些连接。有关序号/日期的更多信息,请查看islands and gaps

insert into "timestamps"
select
  *
from
(
select "OrderNo", "ts", "quantity", case when "timestamp" = 'StartDate' then 1 else -1 end as "factor", 0 as "rolSum" from
    ( select "OrderNo", "StartDate", "EndDate", "quantity" from "data" ) as d
    unpivot ( "ts" for "timestamp" in ( "StartDate", "EndDate" )) as pvt
) as data
order by "ts"

declare @rolSum int = 0
update "timestamps" set @rolSum = "rolSum" = @rolSum + "quantity" * "factor" from "timestamps"

select 
    "OrderNo"
  , "ts"
  , "rolSum"
from
  "timestamps"

请参阅SQL-Fiddle-Demo(包括创建表格和演示数据)。