给一组行一个数值并为每个下一组递增

Give group of rows a numeric value and increment for every next group

我用这个脚本创建了一个 table:

CREATE TABLE [dbo].[BatchTest](
    [Col1] [varchar](50) NULL,
    [Col2] [varchar](50) NULL,
    [Col3] [varchar](50) NULL,
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [BatchId] [int] NOT NULL,
 CONSTRAINT [PK_BatchTest] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

我一直在想是否可以使用 CTE 来实现这一点: 将第一组记录的 BatchId 列的值设置为固定数字,然后对于下一组,BatchId 的值应为:prev。组号+1..以此类推

按子句分组:Col1、Col2、Col3

结果:

A   B   C   34
A   B   C   34
A   B   C   34
A   B   C   34

A   B   D   35
A   B   D   35
A   B   D   35
A   B   D   35

A   B   E   36
A   B   E   36
A   B   E   36
A   B   E   36

开始编号在这种情况下为 34。依此类推为下一组记录增加它。起始号由用户输入。

提前致谢!

我不太确定我是否理解问题 buy 我认为你正在寻找 dense_rank:

示例数据:

INSERT INTO BatchTest (Col1, Col2, Col3, BatchId) VALUES
('1', '1', '1', 0),
('1', '1', '2', 0),
('1', '1', '3', 0),
('1', '1', '1', 0),
('1', '1', '2', 0),
('1', '1', '3', 0);

查询:

SELECT Col1, Col2, Col3, BatchId, Id, DENSE_RANK() OVER(ORDER BY Col1, Col2, Col3) As DR
FROM BatchTest
ORDER BY DR

结果:

Col1    Col2    Col3    BatchId Id  DR
1       1       1       0       1   1
1       1       1       0       4   1
1       1       2       0       5   2
1       1       2       0       2   2
1       1       3       0       3   3
1       1       3       0       6   3

如果开头的BatchId是用户指定的,可以用一个变量来修改DENSE_RANK()函数的值。使用您的数据集,稍微随机化以显示 DENSE_RANK() 有效,我插入了以下内容:

INSERT INTO BatchTest
(
    Col1
    ,Col2
    ,Col3
    ,BatchId
)
VALUES 
('A','B','C',0),
('A','B','C',0),
('A','B','E',0),
('A','B','C',0),
('A','B','D',0),
('A','B','D',0),
('A','B','D',0),
('A','B','C',0),
('A','B','E',0),
('A','B','E',0),
('A','B','D',0),
('A','B','E',0)

然后您可以为 BatchId 起始值使用一个变量,并将 Zohar 的最终查询修改为 UPDATE,像这样,使用 CTE 生成 BatchId 值,然后 JOINing CTE 到 BatchTest:

DECLARE @BatchId INT = 34

;WITH BatchedIds AS
(
    SELECT 
        ID
        , Col1
        , Col2
        , Col3
        , BatchId = ( DENSE_RANK() OVER ( ORDER BY Col1, Col2, Col3 )) + @BatchId - 1
    FROM BatchTest
)
UPDATE bt
SET bt.BatchId = bi.BatchId
FROM BatchTest bt
INNER JOIN BatchedIds bi ON bi.ID = bt.ID

然后您可以查询 BatchTest 并得到这些结果:

SELECT * FROM BatchTest
ORDER BY BatchId

ID  Col1    Col2    Col3    BatchId
4   A       B       C       34
1   A       B       C       34
2   A       B       C       34
8   A       B       C       34
5   A       B       D       35
6   A       B       D       35
7   A       B       D       35
11  A       B       D       35
12  A       B       E       36
9   A       B       E       36
10  A       B       E       36
3   A       B       E       36