防止在基于序号位置的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。不要认为滞后是被支持的。我将编辑上面的评论以反映这比光标感觉好得多。谢谢你。