我正在使用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的新手。任何帮助是极大的赞赏。谢谢。
答案 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
)
实际上374173
是唯一一个在过去6个月内发生变化的故障单组,因此删除了所有其他记录。这令人困惑,因为你在问题中提到了相反的结论。