SQL删除除顶部和底部以外的所有结果
我们有一个存储数据的系统,但对我们来说唯一相关的数据是当天的第一位数据和当天的最新一位数据 我们希望每20分钟运行一次SQL代理作业,以清除当天不是第一次或最新的所有内容,但我不知道如何删除除顶部和底部之外的所有内容SQL删除除顶部和底部以外的所有结果,sql,sql-server,tsql,Sql,Sql Server,Tsql,我们有一个存储数据的系统,但对我们来说唯一相关的数据是当天的第一位数据和当天的最新一位数据 我们希望每20分钟运行一次SQL代理作业,以清除当天不是第一次或最新的所有内容,但我不知道如何删除除顶部和底部之外的所有内容 我知道如何在一个或另一个上面做,但不能同时在两个上面做。有人有什么想法吗?你可以使用deletable,比如: 以cte为例 选择*,按列划分的行数作为按列开始的日期顺序, 按Casts\u col AS日期顺序按ts\u col DESC rn\u end划分的行数 从你的桌子上
我知道如何在一个或另一个上面做,但不能同时在两个上面做。有人有什么想法吗?你可以使用deletable,比如: 以cte为例 选择*,按列划分的行数作为按列开始的日期顺序, 按Casts\u col AS日期顺序按ts\u col DESC rn\u end划分的行数 从你的桌子上 删去 来自cte 其中rn_开始1和rn_结束1;
在这里,我假设您有一个名为ts_col的时间戳列。上面的逻辑根据日期本身而不是时间戳来划分行号,然后标识每个日期的第一个和最后一个记录,从而避免删除这些记录。您没有给我们任何查询,因此我只能给您一个如何执行的示例 参见下面的示例
Delete From User
where Id not in (select top 5 Id from User)
and Id not in (select top 5 Id from User order by desc Id)
现在,您将删除除用户表的前5位和下5位之外的所有内容。首先编写一个查询,选择您感兴趣的数据,然后您的删除操作可以在所述查询中不引用。请提供示例数据和您尝试过的内容。这会让事情变得更清楚你可能在第一个子查询中需要一个order by,否则它将是随机的。不,它已经从上到下获取了数据,所以没有必要。这是不正确的-在T-SQL中没有order by的任何查询都不能保证结果的顺序。非常感谢你。这正是我所希望的。感谢您的伟大解决方案,尽管其中的细节层次非常稀少!请在代码之外添加一些说明。
IF EXISTS(
SELECT * from sys.tables where name ='DeleteTopandBottonRow'
)
BEGIN
DROP TABLE DeleteTopandBottonRow
END
GO
CREATE TABLE DeleteTopandBottonRow
(
ID INT IDENTITY(1,1),
Data UNIQUEIDENTIFIER,
CreatedDate DATETIME
)
GO
INSERT INTO DeleteTopandBottonRow
(
Data,
CreatedDate
)
SELECT NEWID() AS DATA ,GETDATE() AS CreatedDate
GO 50
DELETE
FROM DeleteTopandBottonRow
WHERE CAST(GETDATE() AS DATE) = CAST(CreatedDate AS DATE)
AND DeleteTopandBottonRow.ID
NOT IN
(
SELECT MIN(DeleteTopandBottonRow.ID)
FROM DeleteTopandBottonRow
WHERE CAST(Getdate() AS DATE) = CAST(CreatedDate AS DATE)
UNION ALL
SELECT MAX(DeleteTopandBottonRow.ID)
FROM DeleteTopandBottonRow
WHERE CAST(Getdate() AS DATE) = CAST(CreatedDate AS DATE)
)
GO
SELECT * FROM DeleteTopandBottonRow
GO