首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在S.No 1至5之后重置的列中生成串行Nos

如何在S.No 1至5之后重置的列中生成串行Nos
EN

Stack Overflow用户
提问于 2018-03-07 13:04:46
回答 4查看 145关注 0票数 0

表"X“是每小时一次的截断和加载表,列"A”.Table "X“在每次运行时都可以有5条或>5条或<5条记录。

需要有关以下方面的the查询的帮助:

希望向表"X“中添加一个列"CounterNumber”,该列为前5个插入的记录插入一个从1到5的序列号。

一旦前5条插入记录的序列号从1到5,下一条插入记录的序列号应为1,第7条插入记录的序列号应为2,等等。

简而言之,序列号应在每5次记录后从1次重复到5次。

预期结果,注意SerialNo在每5次记录之后重复:

代码语言:javascript
复制
+---------------+---------+
| CounterNumber | ColumnA |
+---------------+---------+
|             1 | Order1  |
|             2 | Order2  |
|             3 | Order3  |
|             4 | Order4  |
|             5 | Order5  |
|             1 | Order6  |
|             2 | Order7  |
+---------------+---------+
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-03-07 14:45:23

您的应用程序可能会过度使用,并且取决于Server 2012或更高版本,但是序列对象可以完成这项工作。

代码语言:javascript
复制
CREATE SEQUENCE dbo.OrderSerialNumber  
   AS tinyint  
    START WITH 1  
    INCREMENT BY 1  
    MINVALUE 1  
    MAXVALUE 5  
    CYCLE;  
GO  

-- At runtime:

ALTER SEQUENCE dbo.OrderSerialNumber 
RESTART WITH 1; 

INSERT X (CounterNumber, ColumnA)
SELECT 
    NEXT VALUE FOR dbo.OrderSerialNumber AS CounterNumber,
    OrderData.*
FROM
    WhereEverYourDataComesFrom;

当然,如果其他人发现了序列并开始从其中提取数字,它可能会将您抛出,但适当的安全性可以解决这个问题。

票数 1
EN

Stack Overflow用户

发布于 2018-03-07 13:18:07

您需要为此添加至少两个列:一个列表示标识,一个计算列用于1到-5序列号:

代码语言:javascript
复制
ALTER TABLE X
ADD id int identity(1,1),
    Nos as (CASE WHEN id % 5 = 0 THEN 5 ELSE id % 5 END);
GO

测试:

你现有的桌子:

代码语言:javascript
复制
CREATE TABLE X
(
    A int
);

Alter语句:

代码语言:javascript
复制
ALTER TABLE X
ADD id int identity(1,1),
    Nos as (CASE WHEN id % 5 = 0 THEN 5 ELSE id % 5 END);
GO

插入值:

代码语言:javascript
复制
INSERT INTO X VALUES
(1),(2),(3),(4),(5),(6),(7),(8),(9),(10);

测试:

代码语言:javascript
复制
SELECT *
FROM X;

结果:

代码语言:javascript
复制
A   id  Nos
1   1   1
2   2   2
3   3   3
4   4   4
5   5   5
6   6   1
7   7   2
8   8   3
9   9   4
10  10  5

Trancate,插入并再次测试:

代码语言:javascript
复制
TRUNCATE TABLE X;

INSERT INTO X VALUES
(1),(2),(3),(4),(5),(6),(7),(8),(9),(10);


SELECT *
FROM X;

结果:

代码语言:javascript
复制
A   id  Nos
1   1   1
2   2   2
3   3   3
4   4   4
5   5   5
6   6   1
7   7   2
8   8   3
9   9   4
10  10  5

请参阅rextester上的现场演示。

票数 3
EN

Stack Overflow用户

发布于 2018-03-07 13:52:41

类似于佐哈尔

在0上启动iden稍微简单一些。

代码语言:javascript
复制
CREATE TABLE [dbo].[oneFiveB](
    [iden] [int] IDENTITY(0,1) NOT NULL,
    [oneFive]  AS ([iden]%(5)+(1)),
    [val] [varchar](50) NULL
) ON [PRIMARY]  

如果身份有一个缺口(它可以),那么这是失败的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49152691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档