Select 删除第一个条目以外的所有条目

Select to delete every entry other then the first one

我有一个删除查询,它选择除第一个条目之外超过 7 天的每个条目。

这意味着,目前:我找到每一行,按 4 个给定值分组,其中有超过 1 个值并记住时间戳的最高日期 - 然后将其连接到自身以找出删除它们。

与自身的连接非常庞大且非常耗时。 在我所有的数据上,这个删除 reuqest 需要大约 30 分钟才能完成,即使在索引魔法发生之前并且每天都完成之后......

你能帮我加快速度吗?

DELETE FROM [D_PROJEKTE].[dbo].[T_PROTOKOLLE]
WHERE f_index in 
(
  SELECT tab2.f_index FROM 
    (SELECT PROT1.F_ID, PROT1.[F_GERAETE_ADR], PROT1.[F_OBJNR], 
           PROT1.[F_SI] , max(f_datum) as MAXDATE, count(*) as OCCURES
           FROM [D_PROJEKTE].[dbo].[T_PROTOKOLLE] PROT1
           WHERE PROT1.f_datum < dateadd(day, -7, GETDATE())
           and f_id = 9998 -- was älter als 7 Tage, drüber wird nicht gelöscht  
     GROUP BY PROT1.[F_ID]
           ,PROT1.[F_GERAETE_ADR]
           ,PROT1.[F_OBJNR]
           ,PROT1.[F_SI]
     HAVING count(*) > 1 -- was nur einmal vorkommt wird nicht gelöscht 
   ) tab1 
join
    (SELECT 
         F_INDEX, F_ID, F_GERAETE_ADR, F_OBJNR, F_SI, F_DATUM
     FROM 
         [D_PROJEKTE].[dbo].[T_PROTOKOLLE] 
     WHERE 
         f_id = 9998) tab2 ON tab1.F_ID = tab2.F_ID 
                           AND tab1.F_GERAETE_ADR = tab2.F_GERAETE_ADR 
                           AND tab1.F_OBJNR = tab2.F_OBJNR 
                           AND tab1.F_SI = tab2.F_SI
                           AND tab2.f_datum < tab1.MAXDATE)
;WITH X AS 
(
SELECT * 
      , ROW_NUMBER() OVER (PARTITION BY 
                             F_ID
                          , [F_GERAETE_ADR]
                          , [F_OBJNR]
                          , [F_SI]     ORDER BY f_datum DESC) as rn
FROM [D_PROJEKTE].[dbo].[T_PROTOKOLLE] 
WHERE f_datum < dateadd(day, -7, GETDATE()) 
)
DELETE FROM X where rn > 1