选择删除除第一个条目之外的每个条目

时间:2015-08-17 14:17:15

标签: sql sql-server greatest-n-per-group

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

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

加入到自身是巨大的,非常耗时。 在我的所有数据中,这个删除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)

1 个答案:

答案 0 :(得分:3)

;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