Sql server SQL Server-如何根据上一日期的列值删除行?

Sql server SQL Server-如何根据上一日期的列值删除行?,sql-server,tsql,Sql Server,Tsql,我有一个关于如何在SQLServer中完成某些事情的问题。基本上,我希望获取一组来自某个时间段的数据,并删除任何列值(在本例中为SerialNumber)在前3周已输入且有及格分数的行。我根据当前日期进行筛选,以返回任何可能相关的条目。下面是这些数据 问题在于,上述数据中的最终条目的录入日期早于当前日期,且在前3周的时间段内,其结果为“1”。因此,我想删除该SerialNumber值的所有条目,这样它就不会出现在今天的结果中。所需数据如下 希望这对你们有意义。我很难描述。如果需要,当前查询代码如

我有一个关于如何在SQLServer中完成某些事情的问题。基本上,我希望获取一组来自某个时间段的数据,并删除任何列值(在本例中为SerialNumber)在前3周已输入且有及格分数的行。我根据当前日期进行筛选,以返回任何可能相关的条目。下面是这些数据

问题在于,上述数据中的最终条目的录入日期早于当前日期,且在前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

相关子查询允许您将数据与自身进行比较

以下内容查找不存在与21天前pass=1的当前行序列号相同的行

最后一个过滤器只是确保您查看的日期与当前日期不同

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"
                   );
                   

看看它是如何工作的。

你能将你的源数据而不是查询结果作为DDL语句添加到你的问题中吗,这样我们就可以用它更好地帮助你解决问题了?Lars的回答为我指明了正确的方向,所以这篇文章看起来没有必要,但我肯定会继续使用SQL帖子,因为我不知道这是正确的礼仪。我道歉!嗯,我不知道这是件事。工具带的另一个工具。谢谢
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', '1', '2', '1', 'PA'),
  ('6102046905', '2020-08-24 19:47:23.000', '2', '0', '2', '1', 'PA'),
  ('6102046906', '2020-08-24 22:45:16.000', '1', '1', '2', '1', 'PA'),
  ('6102046906', '2020-08-24 19:47:23.000', '2', '0', '2', '1', 'PA'),
  ('6102047024', '2020-08-24 21:03:20.000', '1', '1', '2', '1', 'PA'),
  ('6102047024', '2020-08-24 19:47:23.000', '2', '0', '2', '1', 'PA'),
  ('6102047028', '2020-08-24 18:04:48.000', '1', '1', '2', '1', 'PA');