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