首页 > 解决方案 > 使用值的组合创建一个 SequenceNumber

问题描述

我想创建最后一列“SeqNumber”。我的源数据在 SQL Server 中

我使用了以下

((ROW_NUMBER() OVER (PARTITION by FileDate ORDER BY AutoNumberKey)-1)/(CalcSeqNumber)+1) SeqNumber

它通过将值 070、071、300、301 和 306 组合在一起来正确执行 CalcSeqNumber = 5,但 CalcSeqNumber = 3 不正确。我希望它在3 序列或新的 5 序列(由 070 定义为 5 序列的开始)中看到新的 300 值时重新启动 SeqNumber

文件日期 RTI 自动编号键 CalcSeqNumber 序列号
20211004 070 55644 5 1
20211004 071 55645 5 1
20211004 300 55646 5 1
20211004 301 55647 5 1
20211004 306 55648 5 1
20211004 300 55649 3 2
20211004 301 55650 3 2
20211004 306 55651 3 2
20211004 300 55652 3 3
20211004 301 55653 3 3
20211004 306 55654 3 3
20211004 300 55655 3 4
20211004 301 55656 3 4
20211004 306 55657 3 4
20211004 300 55658 3 5
20211004 301 55659 3 5
20211004 306 55660 3 5
Table scripts for creation and sample data
    CREATE TABLE [dbo].[SeqDataCheck](
        [FileDate] [varchar](50) NULL,
        [RTI] [varchar](50) NULL,
        [AutoNumberKey] [int] NULL,
        [CalcSeqNumber] [int] NULL  
     ) ON [PRIMARY]
     GO


INSERT INTO [dbo].[SeqDataCheck]
           ([FileDate]
           ,[RTI]
           ,[AutoNumberKey]
           ,[CalcSeqNumber])       
     VALUES
           ('20211004','070',55644,5),
           ('20211004','071',55645,5),
           ('20211004','300',55646,5),
           ('20211004','301',55647,5),
           ('20211004','306',55648,5),
           ('20211004','300',55649,5),
           ('20211004','301',55650,5),
           ('20211004','306',55651,5),
           ('20211004','300',55652,5),
           ('20211004','301',55653,5),
           ('20211004','306',55654,5),
           ('20211004','300',55655,5),
           ('20211004','301',55656,5),
           ('20211004','306',55657,5),
           ('20211004','300',55658,5),
           ('20211004','301',55659,5),
           ('20211004','306',55660,5)

GO

标签: sqlsql-servertsql

解决方案


添加另一个PARTITION BY谓词来分区CalcSeqNumber应该会给你想要的结果。

实际上,这意味着对于 FileDate 和 CalcSeqNumber 的每个组合的唯一组合,您希望行号从 1 开始。每次重复该组合时,该数字都会增加。

SELECT FileDate,
       RTI,
       AutoNumberKey,
       CalcSeqNumber,
       ((ROW_NUMBER() OVER (PARTITION by FileDate, CalcSeqNumber ORDER BY AutoNumberKey)-1)/(CalcSeqNumber)+1) AS SeqNumber
  FROM SeqDataCheck;

结果:

文件日期 RTI 自动编号键 CalcSeqNumber 序列号
20211004 300 55649 3 1
20211004 301 55650 3 1
20211004 306 55651 3 1
20211004 300 55652 3 2
20211004 301 55653 3 2
20211004 306 55654 3 2
20211004 300 55655 3 3
20211004 301 55656 3 3
20211004 306 55657 3 3
20211004 300 55658 3 4
20211004 301 55659 3 4
20211004 306 55660 3 4
20211004 070 55644 5 1
20211004 071 55645 5 1
20211004 300 55646 5 1
20211004 301 55647 5 1
20211004 306 55648 5 1

推荐阅读