Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQL Server中保留最新记录并删除旧记录?_Sql_Sql Server - Fatal编程技术网

如何在SQL Server中保留最新记录并删除旧记录?

如何在SQL Server中保留最新记录并删除旧记录?,sql,sql-server,Sql,Sql Server,我的表有如下order by desc值 aaa 12am aaa 11am bbb 12am bbb 11am 我需要删除第2行和第4行并保留最新的一行您可以使用CTE和行编号: ;WITH ToDelete AS ( SELECT ROW_NUMBER() OVER (PARTITION BY name ORDER BY timefield DESC) AS rn FROM mytable ) DELETE FROM ToDelete WHERE rn > 1

我的表有如下order by desc值

aaa  12am
aaa  11am
bbb  12am
bbb  11am

我需要删除第2行和第4行并保留最新的一行

您可以使用
CTE
行编号

;WITH ToDelete AS (
   SELECT ROW_NUMBER() OVER (PARTITION BY name ORDER BY timefield DESC) AS rn
   FROM mytable
)
DELETE FROM ToDelete
WHERE rn > 1
rn=1
标识每个切片的最新记录。对
CTE
执行的删除操作将传播到实际表,并删除除最新记录以外的所有内容

编辑:

要仅选择每张幻灯片的最新记录,请使用:

;WITH CTE AS (
   SELECT *,
          ROW_NUMBER() OVER (PARTITION BY name 
                             ORDER BY timefield DESC) AS rn
   FROM mytable
)
SELECT * 
FROM CTE
WHERE rn = 1

您可以使用带有
行号的
CTE
来执行此操作:

;WITH ToDelete AS (
   SELECT ROW_NUMBER() OVER (PARTITION BY name ORDER BY timefield DESC) AS rn
   FROM mytable
)
DELETE FROM ToDelete
WHERE rn > 1
rn=1
标识每个切片的最新记录。对
CTE
执行的删除操作将传播到实际表,并删除除最新记录以外的所有内容

编辑:

要仅选择每张幻灯片的最新记录,请使用:

;WITH CTE AS (
   SELECT *,
          ROW_NUMBER() OVER (PARTITION BY name 
                             ORDER BY timefield DESC) AS rn
   FROM mytable
)
SELECT * 
FROM CTE
WHERE rn = 1

你们有订购专栏吗?像递增ID一样?不只是两列,按描述基于日期排序您有一些排序列吗?像递增ID一样?不只是两列,按desc基于日期排序如果我不想更改表,而是作为查询,我该怎么做output@user3831886,将
delete
更改为
select
:)什么是“按名称分区”@user3831886您可以将其更改为:partitionby COL1。基本上,您的列名内部有“aaa”和“bbb”值。如果我不想更改表,而是作为查询,我该怎么做output@user3831886,将
delete
更改为
select
:)什么是“按名称分区”@user3831886您可以将其更改为:partitionby COL1。基本上,您的列名中包含“aaa”和“bbb”值