我有一个包含一列值的表,其中包含为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 23
和Record 5
将被删除。
请注意,记录(n)可能不止一次出现,因此它不像对数据值进行计数那么直接。它需要是增量的,记录应始终在另一个开始之前开始和结束,如果它开始并且没有完成,那么我想要删除它。
答案 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
如果您只想查看哪些行会被删除,请将DELETE c1
替换为SELECT c1.*
。
...和往常一样,记得在为互联网上的随机人员运行潜在的破坏性SQL之前进行备份。