Sql 按日期范围删除行

Sql 按日期范围删除行,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我有以下资料: Index dateOfInquiry 649454 2016-02-05 649455 2016-02-05 我有一个疑问: SELECT COUNT(a.dateOfInquiry) as NumberRecords FROM ( SELECT ROW_NUMBER() OVER(ORDER BY dateOfInquiry ASC) Id, dateOfInquiry FROM Tab

我有以下资料:

Index   dateOfInquiry   
649454      2016-02-05 
649455      2016-02-05   
我有一个疑问:

SELECT COUNT(a.dateOfInquiry) as NumberRecords
FROM 
( 
    SELECT ROW_NUMBER() OVER(ORDER BY dateOfInquiry ASC) 
        Id, dateOfInquiry

    FROM 
    Table
) a 

INNER JOIN 
(
    SELECT ROW_NUMBER() OVER(ORDER BY dateOfInquiry ASC) 
            Id, dateOfInquiry

    FROM 
        Table
) 
b 

ON b.ID = a.ID + 1 
WHERE ABS( DATEDIFF(d, a.dateOfInquiry, b.dateOfInquiry ) ) > 14
GROUP BY a.strTransactionID 
我想做的是,在存在记录的情况下,每14天只返回一条记录。因此,我希望上面的数据集中有1,但我得到了0(因为两条记录之间没有14天的间隔,所以它会消除这两条记录)

此外,如果有更多的记录,并且行为不太正确,情况会变得更加复杂。如果我在1号、2号、3号等到15号都有记录,我仍然只想要一条记录,然后在16号或之后的下一条记录上再次开始计数,忽略其他记录,直到差值超过14天

基本上,我想把一条记录数为1,然后忽略所有进一步的记录,直到14天结束

另一个示例,我想要的结果是2:

Index   dateOfInquiry   
649454      2016-02-01  <- count
649455      2016-02-12  -ignore (<l4 past 649454)
649456      2016-02-12  -ignore (<l4 past 649454)
649457      2016-02-17  <- count
649458      2016-02-22  -ignore (<l4 past 649457)
649459      2016-02-25  -ignore (<l4 past 649457)
查询的索引日期
649454 2016-02-01用于为每行获取下一个符合条件行的
id
,并使用递归从开始处开始并继续前进:

;with cte as (
  select t.id, t.dateOfInquiry, x.next_id
  from t
    outer apply (
      select top 1 next_id = i.id
      from t as i
      where i.dateOfInquiry > dateadd(day,14,t.dateOfInquiry)
      order by dateofInquiry, id asc
    ) x
)
, r_cte as (
    --anchor row(s) / starting row(s)
  select 
      id
    , dateOfInquiry
    , next_id
  from cte t
  where not exists (
    select 1
    from cte as i
    where i.id < t.id
    )
  union all
  --recursion starts here
  select 
      c.id
    , c.dateOfInquiry
    , c.next_id
  from cte c
    inner join r_cte p
      on c.id = p.next_id
)
select id, dateOfInquiry
from r_cte
您应该提供真实的场景

使用其他示例数据尝试我的脚本。我在递归CTE中使用了
2行数
函数。因此,假设没有比这更好的解决方案,那么我认为
CURSOR
将是一种更好的、可以理解的方法

declare @t table(Index1 int,dateOfInquiry  datetime) 
insert into @t VALUES
 (649454,'2016-02-01')  --<- count
,(649455,'2016-02-12')  ---ignore (<l4 past 649454)
,(649456,'2016-02-12')  ---ignore (<l4 past 649454)
,(649457,'2016-02-17')  --<- count
,(649458,'2016-02-22')  ---ignore (<l4 past 649457)
,(649459,'2016-03-02')  ---count 
,(649459,'2016-03-15')  ---ignore (<l4 past 649457)

;WITH CTE
AS (
    SELECT min(dateOfInquiry) dateOfInquiry
        ,cast(0 AS BIGINT) r
    FROM @t

    UNION ALL

    SELECT *
    FROM (
        SELECT t.dateOfInquiry
            ,ROW_NUMBER() OVER (
                ORDER BY t.dateOfInquiry
                ) rn1
        FROM @t t
        INNER JOIN (
            SELECT dateOfInquiry
            FROM (
                SELECT dateOfInquiry
                    ,row_number() OVER (
                        ORDER BY dateOfInquiry DESC
                        ) rn
                FROM cte c1
                ) c2
            WHERE rn = 1
            ) c1 ON datediff(day, c1.dateOfInquiry, t.dateOfInquiry) >= 14
        ) t4
    WHERE rn1 = 1
    )
SELECT *
FROM cte
declare@t表(Index1 int,dateofquiry datetime)
插入到@t值中

(649454,'2016-02-01')--谢谢,今天早上我想试试。如果我想从中创建一个视图,我可以将“With”表作为一个视图,并用该视图替换您的cte实例,对吗?@PatrickSchomburg是的,只需将
With
移动到
r\u cte as(
)之前。如下:
what is the use of index column in you requirement ?
declare @t table(Index1 int,dateOfInquiry  datetime) 
insert into @t VALUES
 (649454,'2016-02-01')  --<- count
,(649455,'2016-02-12')  ---ignore (<l4 past 649454)
,(649456,'2016-02-12')  ---ignore (<l4 past 649454)
,(649457,'2016-02-17')  --<- count
,(649458,'2016-02-22')  ---ignore (<l4 past 649457)
,(649459,'2016-03-02')  ---count 
,(649459,'2016-03-15')  ---ignore (<l4 past 649457)

;WITH CTE
AS (
    SELECT min(dateOfInquiry) dateOfInquiry
        ,cast(0 AS BIGINT) r
    FROM @t

    UNION ALL

    SELECT *
    FROM (
        SELECT t.dateOfInquiry
            ,ROW_NUMBER() OVER (
                ORDER BY t.dateOfInquiry
                ) rn1
        FROM @t t
        INNER JOIN (
            SELECT dateOfInquiry
            FROM (
                SELECT dateOfInquiry
                    ,row_number() OVER (
                        ORDER BY dateOfInquiry DESC
                        ) rn
                FROM cte c1
                ) c2
            WHERE rn = 1
            ) c1 ON datediff(day, c1.dateOfInquiry, t.dateOfInquiry) >= 14
        ) t4
    WHERE rn1 = 1
    )
SELECT *
FROM cte