Tsql 如何将一个表缩减到50000条记录的前5000条

Tsql 如何将一个表缩减到50000条记录的前5000条,tsql,Tsql,我有一个相当大的表,包含50000条记录,我想把它减少到5000条。如何编写SQL查询来删除其他45000条记录。基本表结构包含datetime的列 我想要查询的大致情况如下 DELETE FROM mytable WHERE countexceeded(5000) ORDER BY filedate DESC; 我可以用C写这篇文章#以某种方式抓取行索引号并围绕它做一些工作,但是有没有一种整洁的方法可以做到这一点?如果表的顺序正确: DELETE FROM mytable LIMIT 500

我有一个相当大的表,包含50000条记录,我想把它减少到5000条。如何编写SQL查询来删除其他45000条记录。基本表结构包含datetime的列

我想要查询的大致情况如下

DELETE FROM mytable WHERE countexceeded(5000) ORDER BY filedate DESC;

我可以用C写这篇文章#以某种方式抓取行索引号并围绕它做一些工作,但是有没有一种整洁的方法可以做到这一点?

如果表的顺序正确:

DELETE FROM mytable LIMIT 5000
如果没有,并且表格已正确排序自动增量索引:

吵架

SELECT id, filedate FROM mytable LIMIT 1, 50000;
保存id,然后删除

DELETE FROM mytable WHERE id >= @id;
如果排序不正确,您可以使用filedate而不是id,但如果它是一个没有时间的日期,您可能会从同一日期删除不需要的行,因此请小心使用filedate删除解决方案

DELETE TOP(45000) FROM mytable ORDER BY filedate ASC;
将顺序更改为升序,以相反的顺序获取行,然后删除顶部的45000行

希望这有帮助

编辑:-

我为无效的语法道歉。这是我的第二次尝试

DELETE FROM myTable a INNER JOIN
(SELECT TOP(45000) * FROM myTable ORDER BY fileDate ASC) b ON a.id = b.id

如果您没有唯一的列,请使用Martin Smith的CTE答案

您接受的答案的语法无效,因为不允许使用
ORDER BY
子句。你可以用

;WITH T AS
(
SELECT TOP 45000 *
FROM mytable 
ORDER BY filedate 
)
DELETE FROM T

谢谢你。刚注意到今天早上出门前,应该仔细检查一下东西。