如何删除超过 6 个月的行,但确保使用 SQL 在 table 中至少留下 100 行?

How do I delete rows greater than 6 months old , but ensure I have at least 100 rows left in a table using SQL?

考虑以下 table 定义:

FooTable
   ID int,
   TimeStamp datetime,
   Data varchar(50)

我只想保留最近 6 个月的数据,但还要确保在 table 中至少保留 100 行数据。我该怎么做?

我知道如何删除超过 6 个月的数据:

DELETE
FROM FooTable
WHERE TimeStamp <=  DATEADD(MONTH, -6, GETDATE())

如何在table中添加保持至少100行数据的条件(无论数据如何保存)?

谢谢,JohnB

我想你想要:

WITH todelete AS (
      SELECT f.*,
             ROW_NUMBER() OVER (ORDER BY TimeStamp DESC) as seqnum
      FROM FooTable 
     )
DELETE FROM todelete
WHERE seqnum > 100 AND
      TimeStamp < DATEADD(MONTH, -6, GETDATE());

这将删除最旧的时间戳,但要确保它们仅在第 100 条记录之后被删除。

我相信您会在 SSMS 中使用此代码来清理数据,因此您不会关心它是否包含一些变量。

所以,我的解决方案是这样的:

DECLARE @CURRENT_NO INT
SELECT @CURRENT_NO = COUNT(*) FROM xTable WHERE timstamp < DATEADD(MONTH, -6, GETDATE())
DECLARE @DEL_NO INT
SELECT @DEL_NO = CASE WHEN @CURRENT_NO < 100 THEN 100 ELSE @CURRENT_NO END 
DECLARE @DEL_ROW_NO INT
SELECT @DEL_ROW_NO = COUNT(*) + @DEL_NO - 100 FROM xTable WHERE timstamp > DATEADD(MONTH, -6, GETDATE())
DELETE TOP (@DEL_ROW_NO) FROM xTable WHERE timstamp < DATEADD(MONTH, -6, GETDATE())
SELECT * FROM xTable

我已经使用下面的脚本(最小化版本)对其进行了测试:

CREATE TABLE xTable (timstamp DATETIME, qty INT)
INSERT INTO xTable VALUES
('2020-11-01', 5), ('2020-01-01', 5), ('2020-01-01', 5), ('2020-01-01', 5), ('2020-01-01', 5), 
('2020-11-01', 5), ('2020-01-01', 5), ('2020-01-01', 5), ('2020-01-01', 5), ('2020-01-01', 5)

DECLARE @CURRENT_NO INT
SELECT @CURRENT_NO = COUNT(*) FROM xTable WHERE timstamp < DATEADD(MONTH, -6, GETDATE())
DECLARE @DEL_NO INT
SELECT @DEL_NO = CASE WHEN @CURRENT_NO < 5 THEN 5 ELSE @CURRENT_NO END 
SELECT @DEL_NO
DECLARE @DEL_ROW_NO INT
SELECT @DEL_ROW_NO = COUNT(*) + @DEL_NO - 5 FROM xTable WHERE timstamp > DATEADD(MONTH, -6, GETDATE())
SELECT @DEL_ROW_NO
DELETE TOP (@DEL_ROW_NO) FROM xTable WHERE timstamp < DATEADD(MONTH, -6, GETDATE())
SELECT * FROM xTable

DROP TABLE xTable

结果是:

+-------------------------+-----+
| timstamp                | qty |
+-------------------------+-----+
| 2020-11-01 00:00:00.000 | 5   |
| 2020-11-01 00:00:00.000 | 5   |
| 2020-01-01 00:00:00.000 | 5   |
| 2020-01-01 00:00:00.000 | 5   |
| 2020-01-01 00:00:00.000 | 5   |
+-------------------------+-----+