防止在基于序号位置的SQL查询中删除行

防止在基于序号位置的SQL查询中删除行,sql,sql-server,Sql,Sql Server,所以我有一个行集合,看起来像: Text Sequence ITEM1 1 ITEM1 2 ITEM1 3 ITEM2 4 ITEM2 5 ITEM3 6 ITEM2 7 ITEM2 8 ITEM1 9 ITEM1 10 我希望结果如下所示: Text Sequence ITEM1 1 ITEM2 4 ITEM3 6 ITEM2 7 ITEM1 9 因此,我获取一行的第一个实例,只保留第一个序列号。但是,如果该项在列表的下一个位置重复,我也会保留该实例的序列

所以我有一个行集合,看起来像:

Text  Sequence
ITEM1  1
ITEM1  2
ITEM1  3
ITEM2  4
ITEM2  5
ITEM3  6
ITEM2  7
ITEM2  8
ITEM1  9
ITEM1  10
我希望结果如下所示:

Text  Sequence
ITEM1  1
ITEM2  4
ITEM3  6
ITEM2  7
ITEM1  9
因此,我获取一行的第一个实例,只保留第一个序列号。但是,如果该项在列表的下一个位置重复,我也会保留该实例的序列号

我的SQL是:

SELECT Text,Seq=Min(Sequence)
FROM Items
GROUP BY Text
ORDER BY Seq
其结果是:

Text  Sequence
ITEM1  1
ITEM2  4
ITEM3  6

GROUPBY Text语句正在删除第4行和第5行。如何避免这种情况?

LAG允许您查看上一条记录。将文本与前一行进行比较。仅显示文本与前一行不同的行

select sequence, text
from
(
  select sequence, text, lag(text) over (order by sequence) as prev_text
  from mytable
)
where prev_text != text
or prev_text is null -- for the first line
order by sequence;

我对此并不完全满意,因为我认为会有一个更优雅的解决方案,但是使用光标:

DECLARE @text varchar(max)
DECLARE @sequence int
DECLARE @previousText varchar(max)=''
DECLARE @results TABLE (text varchar(max), sequence int)

DECLARE iterator CURSOR FOR 
SELECT Text, Sequence
FROM Items

OPEN iterator

FETCH NEXT FROM iterator
INTO @text, @sequence

WHILE @@FETCH_STATUS = 0

IF(@text<>@previousText)
BEGIN
    INSERT INTO @results (text,sequence) VALUES (@text,@sequence)
    SET @previousText=@text
    FETCH NEXT FROM iterator INTO @text, @sequence
END
ELSE
    FETCH NEXT FROM iterator INTO @text, @sequence

CLOSE iterator
DEALLOCATE iterator

SELECT * FROM @results
DECLARE@text varchar(最大值)
声明@sequence int
声明@previousText varchar(max)=”
声明@results表(text varchar(max),sequence int)
声明的迭代器游标
选择文本、顺序
从项目
开放迭代器
从迭代器获取下一个
进入@text,@sequence
而@@FETCH\u STATUS=0
如果(@text@previousText)
开始
插入@results(text,sequence)值(@text,sequence)
设置@previousText=@text
从迭代器中提取下一个到@text,@sequence
结束
其他的
从迭代器中提取下一个到@text,@sequence
闭迭代器
取消分配迭代器
从@results中选择*

调整脚本以允许序列中的间隙

DECLARE @t TABLE(Text char(5), Sequence int)
INSERT @t VALUES
('ITEM1',1),('ITEM1',2),('ITEM1',3),('ITEM2',4),('ITEM2',5),
('ITEM3',6),('ITEM2',7),('ITEM2',8),('ITEM1',9),('ITEM1',10)

;WITH x as
(
  SELECT Text,Sequence,
    row_number() OVER (order by Sequence)
    - row_number() OVER (partition by text order by Sequence) grp
  FROM @t
)
SELECT text, MIN(Sequence) seq
FROM x
GROUP BY text, grp
ORDER BY seq
结果:

text  seq
ITEM1 1
ITEM2 4
ITEM3 6
ITEM2 7
ITEM1 9

谢谢,不过我也需要支持SQL 2008。不要认为滞后是被支持的。我将编辑上面的评论以反映这比光标感觉好得多。谢谢你。