sql - 使用值的组合创建一个 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
解决方案
添加另一个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 |
推荐阅读
- http - Firefox 从请求中删除身份验证标头
- javascript - 鼠标点击在表单的谷歌recaptcha复选框上不起作用
- c++ - C++ String to Number 自定义函数问题
- node.js - 返回承诺的响应不起作用:未定义的变量
- c# - 无法使用 C# 获取 GoogleTrends 数据
- android - Android Studio 北极狐中缺少 Jetpack Compose 的“预览配置选择器”选项 2020.3.1 测试版 3
- json.net - 无法使用 azure 函数将 json 存储在 azure blob 存储中的单行中
- python - Colab:将 Python 模块收集到一个笔记本中
- java - 如何使用 for-each 循环在 Java 中打印字符串对象的每个字符?
- python - Django无法保存表单尝试在字段中设置用户