SQL - 如果未满足增量模式,则删除值

时间:2014-05-12 09:31:11

标签: sql sql-server-2008 tsql reportbuilder3.0

我有一个包含一列值的表,其中包含为1个用户提取的以下示例数据:

ID  |  Data
5      Record1
12     NULL
13     NULL
15     Record1
20     Record12
28     NULL
31     NULL
35     Record12
37     Record23
42     Record34
51     NULL
53     Record34 
58     Record5
61     Record17
63     NULL
69     Record17

我想要做的是删除数据列中没有开始和结束记录的数据列中的任何值。因此,上述Record 23Record 5将被删除。

请注意,记录(n)可能不止一次出现,因此它不像对数据值进行计数那么直接。它需要是增量的,记录应始终在另一个开始之前开始和结束,如果它开始并且没有完成,那么我想要删除它。

1 个答案:

答案 0 :(得分:2)

可悲的是,SQL Server 2008没有LAG或LEAD,这会使操作更简单。

您可以使用公用表表达式来查找非连续(非空)值,并删除它们;

WITH cte AS (
  SELECT *, ROW_NUMBER() OVER (ORDER BY id) rn FROM table1 WHERE data IS NOT NULL
)
DELETE c1 FROM cte c1
LEFT JOIN cte c2 ON (c1.rn = c2.rn+1 OR c1.rn = c2.rn-1) AND c1.data = c2.data
WHERE c2.id IS NULL

An SQLfiddle to test with

如果您只想查看哪些行会被删除,请将DELETE c1替换为SELECT c1.*

...和往常一样,记得在为互联网上的随机人员运行潜在的破坏性SQL之前进行备份。