【问题标题】:Deleting records on a group by where condition?按where条件删除组中的记录?
【发布时间】:2014-03-18 20:26:58
【问题描述】:

我使用的是 SQL 2012,我有这张表:

Id  Ticket  LastChange
1   369151  2010-03-18 
2   369151  2010-03-18 
11  374173  2010-11-11 
12  374173  2010-11-11 
13  374173  2010-11-11 
54  374173  2014-01-13 
63  374503  2010-11-18 
64  393920  2010-10-15 
65  393920  2010-10-15 
69  393920  2010-10-19 
70  393920  2012-03-29 
71  404145  2011-03-04 
77  404145  2011-03-04 
78  404145  2011-03-10 
79  404145  2011-03-10 
80  404145  2011-03-10 
81  404145  2011-03-28 
82  404145  2011-03-28 
83  404145  2011-03-28 
84  404146  2011-03-04 

我想删除其工单组在过去 x 个月内没有更改的所有记录。例如,如果票据 374173 在过去 6 个月内没有 LastChange,则删除票据 374173 的表中的所有记录。

我可以用一个荒谬的组查询、加入、子查询、子查询、删除来做到这一点,但它似乎过于复杂。我认为分区可能是一种更简单的方法,但对 TSQL 来说仍然是新手。任何帮助是极大的赞赏。谢谢。

【问题讨论】:

    标签: sql tsql


    【解决方案1】:

    您可以使用子查询来获取要删除的票证。修改“过去 6 个月”部分以满足您的确切需求。

    DELETE FROM table1
    WHERE Ticket IN
        (SELECT Ticket FROM table1
         GROUP BY Ticket
         HAVING MAX(LastChange) < DATEADD(month, -6, GETDATE()))
    

    【讨论】:

      【解决方案2】:

      我会使用一个简单的NOT EXISTS

      DELETE t1 FROM dbo.Table1 t1 
      WHERE NOT EXISTS
      (
          SELECT 1 FROM dbo.Table1 t2
          WHERE t1.Ticket = t2.Ticket
          AND Datediff(Month, t2.LastChange, GETDATE()) <= 6 
      )
      

      Demo

      实际上374173 是唯一一个在过去 6 个月内发生变化的 Ticket-Group,因此所有其他记录都将被删除。这令人困惑,因为您在问题中提到了相反的内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-18
        相关资源
        最近更新 更多