我有一个特殊的情况,我得到一些类似于以下内容的行,这来自于我无法控制的某些集成操作。
请使用此脚本进行复制
CREATE TABLE #SOMETABLE
(
FIELD VARCHAR,
VALUE INT
)
INSERT INTO #SOMETABLE
(FIELD,VALUE)
VALUES
('A',1),
('B',3),
('C',5),
('A',90),
('B',15),
('C',21),
('A',31),
('B',75),
('C',82)
SELECT * FROM #SOMETABLE
您会得到
如您所见,A-B-C模式会重复其自身,并保证按此顺序重复,因此我需要使用额外的计算列(GROUP)来标识这些行的“组”。
所以它必须像这样结束
[我尝试过几次la脚的尝试,搜索过google,在这里和那里阅读文章,但我什至不知道Google搜索要使用什么术语,it does seem that MSSQL can identify patterns in rows,但我不确定从哪里开始
所以我的问题是:如何识别MSSQL 2014中的行组?
可能是最简单,最简单的方法是使用游标在行上进行迭代:
create table #sometable2
(
field varchar,
[value] int,
[group] int
)
declare @field char(1)
declare @value int
declare @group int = 1
declare something_cursor cursor for
select field, [value] from #sometable
open something_cursor
fetch next from something_cursor into @field, @value
while @@fetch_status = 0
begin
insert into #sometable2 select @field, @value, @group
if @field = 'C' set @group = (select @group + 1)
fetch next from something_cursor into @field, @value
end
close something_cursor
deallocate something_cursor
select * from #sometable2
结果:
╔═══════╤═══════╤═══════╗
║ field │ value │ group ║
╠═══════╪═══════╪═══════╣
║ A │ 1 │ 1 ║
╟───────┼───────┼───────╢
║ B │ 3 │ 1 ║
╟───────┼───────┼───────╢
║ C │ 5 │ 1 ║
╟───────┼───────┼───────╢
║ A │ 90 │ 2 ║
╟───────┼───────┼───────╢
║ B │ 15 │ 2 ║
╟───────┼───────┼───────╢
║ C │ 21 │ 2 ║
╟───────┼───────┼───────╢
║ A │ 31 │ 3 ║
╟───────┼───────┼───────╢
║ B │ 75 │ 3 ║
╟───────┼───────┼───────╢
║ C │ 82 │ 3 ║
╚═══════╧═══════╧═══════╝
尝试一下:
在添加到临时表之前,向该表和VOILA添加一个自动增量:
DROP TABLE #SOMETABLE
CREATE TABLE #SOMETABLE
(
ID int NOT NULL IDENTITY(1,1),
FIELD VARCHAR,
VALUE INT
)
INSERT INTO #SOMETABLE
( FIELD,VALUE)
VALUES
('A',1),
('B',3),
('C',5),
('A',90),
('B',15),
('C',21),
('A',31),
('B',75),
('C',82)
SELECT *, ceiling(ID/3.0) FROM #SOMETABLE
您是否可以添加另一个ID列?也许还有ROW_NUMBER()窗口函数。
CREATE TABLE #SOMETABLE
(
ID INT,
FIELD VARCHAR,
VALUE INT
)
INSERT INTO #SOMETABLE
(ID,FIELD,VALUE)
VALUES
(1,'A',1),
(2,'B',3),
(3,'C',5),
(4,'A',90),
(5,'B',15),
(6,'C',21),
(7,'A',31),
(8,'B',75),
(9,'C',82)
SELECT t.*
, ROW_NUMBER() OVER(PARTITION BY t.ID % 3 ORDER BY t.ID) rn
FROM #SOMETABLE t
ORDER BY t.ID
或者如果您无法添加ID字段...我不保证:
SELECT t2.*
, ROW_NUMBER() OVER(PARTITION BY t2.ID % 3 ORDER BY t2.ID) rn
FROM(
SELECT t.*, ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) ID
FROM #SOMETABLE t
)t2
ORDER BY t2.ID