如何删除超过 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 |
+-------------------------+-----+
考虑以下 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 |
+-------------------------+-----+