删除除100个最新行以外的所有行

סטנ*_*ונן 6 sql t-sql sql-server datetime sql-delete

我正在使用MS SQL数据库,并且有一个名为“ Logs”的表,如下所示:

在此处输入图片说明

记录在这里一个接一个地添加,因此表在几天/几周后变得很大。

我需要定期进行的是一些清理工作。即我需要一个SQL查询,该查询将删除较旧的行并仅在此表中保留最近的100条记录。

我同意最好让它“删除早于some_date的记录” ...以前是这样的,但是客户希望它与众不同:(所以...在这里。

顺便说一句:我对人们对此问题持否定态度感到失望。有什么问题吗?... 想像一下:这个问题已经产生了4个答案!!!……一个人决定对此否定!现在我真的不知道该怎么想...周围的人很奇怪:(

Sal*_*n A 10

您可以使用以下之一:

-- offset clause
WITH goners AS (
    SELECT *
    FROM Logs
    ORDER BY DateTime DESC
    OFFSET 100 ROWS 
)
DELETE FROM goners

-- numbered rows
WITH goners AS (
    SELECT ROW_NUMBER() OVER(ORDER BY DateTime DESC) AS rn, Logs.*
    FROM Logs
)
DELETE FROM goners
WHERE rn > 100

-- nth value
-- note that this "keeps" all rows that tie for last place
DELETE FROM Logs
WHERE DateTime < (
    SELECT MIN(DateTime)
    FROM (
        SELECT TOP 100 DateTime
        FROM Logs
        ORDER BY DateTime DESC
    ) AS x
)
Run Code Online (Sandbox Code Playgroud)