Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 为行组指定一个数值,并为下一个组指定增量_Tsql_Sql Server 2017 - Fatal编程技术网

Tsql 为行组指定一个数值,并为下一个组指定增量

Tsql 为行组指定一个数值,并为下一个组指定增量,tsql,sql-server-2017,Tsql,Sql Server 2017,我已使用以下脚本创建了一个表: 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 C

我已使用以下脚本创建了一个表:

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]
我一直在想,是否可以使用CTEs来实现这一点: 对于第一组记录,将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号开始。以此类推,为下一组记录递增它。开始编号由用户输入


提前谢谢

我不确定我是否理解这个问题,我想你是在寻找高密度排名:

样本数据:

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,则可以使用变量修改稠密_秩函数的值。使用您的数据集(稍微随机化以显示密集等级工作),我插入了以下内容:

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的最终查询修改为更新,如下所示,使用CTE生成BatchId值,然后将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

这听起来像是一个X-Y问题。你到底想做什么?另外,向我们展示表格DDL是询问你问题的好的第一步,但我们需要看到实际使用表格的代码,以便能够帮助你。我尝试了一些查询,但不值得在描述中添加,因为它们没有给出接近我想要实现的结果。谢谢!我确实想到了密集排列,但它不允许为第一组选择起始编号,然后为下一组选择递增编号。此外,BatchId列是需要更新的。哦,我的糟糕!变量-1错过了这个技巧。谢谢@digital.亚伦!这对我有帮助。