识别MSSQL 2014中的行模式

问题描述 投票:1回答:3

我有一个特殊的情况,我得到一些类似于以下内容的行,这来自于我无法控制的某些集成操作。

请使用此脚本进行复制

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

您会得到

enter image description here

如您所见,A-B-C模式会重复其自身,并保证按此顺序重复,因此我需要使用额外的计算列(GROUP)来标识这些行的“组”。

所以它必须像这样结束

enter image description here

[我尝试过几次la脚的尝试,搜索过google,在这里和那里阅读文章,但我什至不知道Google搜索要使用什么术语,it does seem that MSSQL can identify patterns in rows,但我不确定从哪里开始

所以我的问题是:如何识别MSSQL 2014中的行组?

sql sql-server sql-server-2014
3个回答
0
投票

可能是最简单,最简单的方法是使用游标在行上进行迭代:

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     ║
╚═══════╧═══════╧═══════╝

0
投票

尝试一下:

在添加到临时表之前,向该表和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

0
投票

您是否可以添加另一个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
© www.soinside.com 2019 - 2024. All rights reserved.