按特定标识符对行进行分组,并更新组ID列以跟踪它们所属的组

时间:2017-06-30 13:31:43

标签: sql sql-server database stored-procedures

有一个表,其中group id列需要使用生成的增量编号填充,如下例所示:

name batch
a    1
b    1
c    1
d    2
e    2
f    2
g    3
h    3
i    3
j    4
k    4

只要组具有相同数量的元素

,顺序无关紧要

寻找一些如何实现这一目标的想法。

我在想的是构建一个迭代结果集的存储过程。

我也有这个"伪代码"我正在使用,但显然有问题,并且也没有做更新部分只是选择,我想创建一个看似有点矫枉过正的临时表

SELECT
  name,
  batch = (ROW_NUMBER() OVER(ORDER BY name)) % ((Select COUNT(*) from [abc].[dbo].[cdg]) / 30))
FROM
  [abc].[dbo].[cdg] x

2 个答案:

答案 0 :(得分:4)

尝试使用此整数除法方法

Declare @param int  = 3

SELECT name,
      ( ( Row_number()OVER(ORDER BY name) - 1 ) / @param  ) + 1 as Batch
FROM   tablename

如果您想从表格@param派生count,请使用Count(*) Over()

SELECT name,
      ( ( Row_number()OVER(ORDER BY name) - 1 ) / (Count(*) Over()/30)  ) + 1 as Batch
FROM   tablename

更新batch

;with update_cte as
(
SELECT name,
       Batch,
       ( ( Row_number()OVER(ORDER BY name) - 1 ) / @param  ) + 1 as gen_seq
FROM   tablename
)
Update update_cte set Batch = gen_seq

答案 1 :(得分:2)

你在找这样的东西吗?你可以使用NTILE功能。

drop table if exists dbo.Tile;

create table dbo.Tile (
    Chr char(1)
);

insert into dbo.Tile (Chr)
values ('a'), ('b'), ('c'), ('d'), ('e')
    , ('f'), ('g'), ('h'), ('i'), ('j')
    , ('k');

declare @Tile int

set @Tile = ceiling((select count(t.Chr) from dbo.Tile t) / 3.)

select
    *
    , ntile(@Tile) over (order by t.Chr) as batch
from dbo.Tile t