按条件删除组中的记录?

时间:2014-03-18 20:26:59

标签: sql tsql

我正在使用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个月中Ticket组没有变化的所有记录。例如,如果故障单374173在过去6个月内没有LastChange,则使用故障单374173删除表中的所有记录。

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

我会使用简单的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个月内发生变化的故障单组,因此删除了所有其他记录。这令人困惑,因为你在问题中提到了相反的结论。