【问题标题】:Group rows by a certain identifier and update a group id column to track which group they belong按特定标识符对行进行分组并更新组 id 列以跟踪它们属于哪个组
【发布时间】:2017-06-30 13:31:42
【问题描述】:

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

【问题讨论】:

标签: sql sql-server database stored-procedures


【解决方案1】:

试试这个整数除法

Declare @param int  = 3

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

如果您想从表 count 派生 @param,请使用 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

【讨论】:

  • 不错,整数数学!一段时间以来,我第一次看到它的有用用途:P
  • 所以可以说批处理列是空的,有什么方法可以合并我们生成的值吗?
  • @otc - 我们需要将 Select 更改为 Update 语句。将更新我的答案
  • 看起来很棒,将在几秒钟内进行测试,非常感谢
  • @Prdp 我已经有一个表,看起来上面的脚本正在创建一个新表。有什么我需要调整的,以便可以更新我现有表的批处理列。
【解决方案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

【讨论】:

  • 最好使用Count(*) Over() 而不是单独的表命中来计算记录。 +1 我正在用这个编辑我的答案
猜你喜欢
  • 2021-02-09
  • 2017-10-07
  • 2017-07-20
  • 2020-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-16
  • 2018-01-20
相关资源
最近更新 更多