有一个表,其中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
答案 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