如何解决SQL Server-如何根据上一日期的列值删除行?
我对如何在SQL Server中完成某事有疑问。基本上,我想从某个时间段获取一组数据,并删除在过去3周中已输入列值(在本例中为SerialNumber)并具有通过标记的所有行。我根据当前日期进行过滤,以返回所有可能相关的条目。下面是这些数据。
问题是上述数据中的最后一个条目的输入日期早于当前日期,且位于前3个星期的时间范围内,结果传递为“ 1”。因此,我想删除该SerialNumber值的所有条目,以便不在今天的结果中列出。所需数据如下。
希望这对你们来说很有意义。我很难描述。如果需要,当前查询代码在下面。由于我不确定该怎么做,因此它并未尝试实现所需的功能。
Select * From
(SELECT A.SerialNumber,[EndTime] as Date,ROW_NUMBER() over (partition by A.SerialNumber order by EndTime desc) Entry,[Pass],A.EntryTotal,A.Passes,CycleType
From
(
SELECT max([SerialNumber]) as SerialNumber,Count(*) as EntryTotal,sum(convert(int,TD.Pass)) as Passes
FROM [FlowDB2].[dbo].[TimeAnalyticsData] TD
where Pass is not null
group by SerialNumber
)
as A join [FlowDB2].[dbo].[TimeAnalyticsData] as TAD on A.SerialNumber = TAD.SerialNumber
inner join [FlowDB2].[dbo].[TimeAnalytics] as TA on TAD.DurationID = TA.DurationID
where
Pass is not null
and
(EndTime >= '2020-08-24 16:00:00' and EndTime < '2020-08-25 4:00:00')
) as B
解决方法
相关子查询允许您将数据与其自身进行比较。
以下内容查找的序列号与当前行(距pass = 1)少于21天的行相同的行不存在。
最终的过滤器只是确保您要查找的日期与当前日期不同。
select *
from original_data od1
where not exists (select null
from original_data od2
where and od2.pass = 1
and od2.serialnumber = od1.serialnumber
and od2."Date" > DATEADD(day,-21,od1.date)
and od2."Date" <> od1."Date"
);
以如下方式重新创建原始数据:
CREATE TABLE original_data (
"SerialNumber" BIGINT,"Date" datetime,"Entry" INTEGER,"Pass" INTEGER,"EntryTtl" INTEGER,"Passes" INTEGER,"CycleTy" VARCHAR(2)
);
INSERT INTO original_data
("SerialNumber","Date","Entry","Pass","EntryTtl","Passes","CycleTy")
VALUES
('6102046905','2020-08-24 21:03:20.000','1','2','PA'),('6102046905','2020-08-24 19:47:23.000','0',('6102046906','2020-08-24 22:45:16.000',('6102047024',('6102047028','2020-08-24 18:04:48.000','PA');
在this Fiddle中查看其工作原理。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。