表"X“是每小时一次的截断和加载表,列"A”.Table "X“在每次运行时都可以有5条或>5条或<5条记录。
需要有关以下方面的the查询的帮助:
希望向表"X“中添加一个列"CounterNumber”,该列为前5个插入的记录插入一个从1到5的序列号。
一旦前5条插入记录的序列号从1到5,下一条插入记录的序列号应为1,第7条插入记录的序列号应为2,等等。
简而言之,序列号应在每5次记录后从1次重复到5次。
预期结果,注意SerialNo在每5次记录之后重复:
+---------------+---------+
| CounterNumber | ColumnA |
+---------------+---------+
| 1 | Order1 |
| 2 | Order2 |
| 3 | Order3 |
| 4 | Order4 |
| 5 | Order5 |
| 1 | Order6 |
| 2 | Order7 |
+---------------+---------+发布于 2018-03-07 14:45:23
您的应用程序可能会过度使用,并且取决于Server 2012或更高版本,但是序列对象可以完成这项工作。
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;当然,如果其他人发现了序列并开始从其中提取数字,它可能会将您抛出,但适当的安全性可以解决这个问题。
发布于 2018-03-07 13:18:07
您需要为此添加至少两个列:一个列表示标识,一个计算列用于1到-5序列号:
ALTER TABLE X
ADD id int identity(1,1),
Nos as (CASE WHEN id % 5 = 0 THEN 5 ELSE id % 5 END);
GO测试:
你现有的桌子:
CREATE TABLE X
(
A int
);Alter语句:
ALTER TABLE X
ADD id int identity(1,1),
Nos as (CASE WHEN id % 5 = 0 THEN 5 ELSE id % 5 END);
GO插入值:
INSERT INTO X VALUES
(1),(2),(3),(4),(5),(6),(7),(8),(9),(10);测试:
SELECT *
FROM X;结果:
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 5Trancate,插入并再次测试:
TRUNCATE TABLE X;
INSERT INTO X VALUES
(1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
SELECT *
FROM X;结果:
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上的现场演示。
发布于 2018-03-07 13:52:41
类似于佐哈尔
在0上启动iden稍微简单一些。
CREATE TABLE [dbo].[oneFiveB](
[iden] [int] IDENTITY(0,1) NOT NULL,
[oneFive] AS ([iden]%(5)+(1)),
[val] [varchar](50) NULL
) ON [PRIMARY] 如果身份有一个缺口(它可以),那么这是失败的。
https://stackoverflow.com/questions/49152691
复制相似问题