在SQL Server中替换偏移量限制

时间:2019-07-12 19:51:50

标签: sql-server-2012 offset sql-delete

我们有DataTemp表,该表具有desc顺序的记录。

select * from ( 
select 9,'a',3 union 
select 8,'a',2 union 
select 7,'b',3 union 
select 6,'a',1 union 
select 5,'b',2 union 
select 4,'c',3 union 
select 3,'c',2 union 
select 2,'b',1 union 
select 1,'c',1 
) door (sno,id, N_th_Reocord) 
  1. sno-自动编号。
  2. id-门的代码*。
  3. N_th_Record-用于表示n记录。

一次,每个“门”仅需要存储三张记录。例如,门“ a”具有新条目(意味着第4条记录),则“ a”门的第一个需要删除。

第4条记录:

select * from ( 
select 10,'a',4 union --- new entry 
select 9,'a',3 union 
select 8,'a',2 union 
select 7,'b',3 union 
select 6,'a',1 union -- need to delete
select 5,'b',2 union 
select 4,'c',3 union 
select 3,'c',2 union 
select 2,'b',1 union 
select 1,'c',1 
) door (sno,id, N_th_Reocord) 

我进行以下查询。但是我需要最简单的方法删除行。因为,我们试图减少整个项目的时间消耗。

delete from door where sno = (
 select sno from ( 
  select 10,'a',4 union 
  select 9,'a',3 union 
  select 8,'a',2 union 
  select 7,'b',3 union 
  select 6,'a',1 union 
  select 5,'b',2 union 
  select 4,'c',3 union 
  select 3,'c',2 union 
  select 2,'b',1 union 
  select 1,'c',1 
 ) door (sno,id, N_th_Reocord) 
 where id = 'a' 
 order by sno desc -- For 'DataTemp' *order by* is no needed. 
 offset 3 rows fetch next 1 rows only 
) 

注意:

  1. 例如给出三行和三个门。实际上,我们每12门有144行。
  2. 在此删除之前,我们会检查许多业务规则。
  3. 版本:SQL Server 2012

1 个答案:

答案 0 :(得分:1)

您可以使用ROW_NUMBER

WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY id ORDER BY sno DESC) rn FROM t)
DELETE FROM cte WHERE rn > 3;

db<>fiddle demo