ID Name
1 A
2 B
3 A
5 A
6 A
7 B
10 B
从这些记录中我只想在记录下方,是否可能?
ID Name
1 A
2 B
3 C
4 A
7 B
9 C
10 B
答案 0 :(得分:0)
看起来你要求删除连续的(当被认为是有序的)值时。
如果我们假设ID
值应该被视为持续增加而没有间隙,那么它可以很容易地完成 - 只需要左连接回自己并要求前一行具有不同的值,或者前一行不存在(包括第一行):
select cur.ID, cur.[Name]
from @data cur
left outer join @data prev on prev.[ID] = cur.[ID] - 1
where prev.ID is null or prev.[Name] <> cur.[Name]
order by cur.ID
如果我们不假设ID
值需要连续,那就太棘手了;这里我使用ROW_NUMBER()
函数来模拟它:
select cur.ID, cur.[Name]
from (select ID, [Name], Row = ROW_NUMBER() over (order by ID) from @data) cur
left outer join (select ID, [Name], Row = ROW_NUMBER() over (order by ID) from @data) prev
on prev.[Row] = cur.[Row] - 1
where prev.ID is null or prev.[Name] <> cur.[Name]
order by cur.ID
可能有更好的方法。
在这两个方面,我正在使用:
declare @data table (ID int not null, [Name] char(1) not null);
insert @data (ID, [Name]) values (1,'A'),(2,'B'),(3,'C'),(4,'A'),(5,'A'),
(6,'A'),(7,'B'),(8,'B'),(9,'C'),(10,'B');
似乎符合您的预期输出(但不是您声明的输入)