TSQL-用于生成增量序列号的查询帮助
需要有关查询的帮助以在下表中生成两个增量值TSQL-用于生成增量序列号的查询帮助,sql,sql-server,tsql,Sql,Sql Server,Tsql,需要有关查询的帮助以在下表中生成两个增量值 BatchNo和BatchSequenceNo都应该从1开始 BatchSequenceNo应增加1,最多500行 CREATE TABLE #tblBatch ( BatchId INT NOT NULL IDENTITY(1,1) PRIMARY KEY, Sname VARCHAR(50) NOT NULL, BatchNo int, BatchSequenceNo int ) ---Load some samp
BatchNo
和BatchSequenceNo
都应该从1开始
BatchSequenceNo
应增加1,最多500行
CREATE TABLE #tblBatch
(
BatchId INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
Sname VARCHAR(50) NOT NULL,
BatchNo int,
BatchSequenceNo int
)
---Load some sample data
INSERT INTO #tblBatch(Sname)
SELECT TOP 2010
'A -SampleText-' + CAST(row_number() over(order by t1.number) as varchar) as N
FROM
master..spt_values t1
CROSS JOIN
master..spt_values t2
在501行,BatchNo
应增加1(即BatchNo=2)和
BatchSequenceNo
应重置为1
BatchNo
值需要每500行增加1
CREATE TABLE #tblBatch
(
BatchId INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
Sname VARCHAR(50) NOT NULL,
BatchNo int,
BatchSequenceNo int
)
---Load some sample data
INSERT INTO #tblBatch(Sname)
SELECT TOP 2010
'A -SampleText-' + CAST(row_number() over(order by t1.number) as varchar) as N
FROM
master..spt_values t1
CROSS JOIN
master..spt_values t2
您可以使用模和除法来实现这一点
Select
CAST(((row_number() over(order by t1.number) / 500)+1) as int) as BatchNo,
CAST(((row_number() over(order by t1.number)-1 % 500)+1) as int) as BatchSequenceNo
from master..spt_values t1
cross join master..spt_values t2
使用除法运算符和模运算符分别获取batchno和batchsequenceno
Select top 2010
1+(row_number() over(order by t1.number)-1)/500 as batch_no
,'A -SampleText-'+cast(1+(row_number() over(order by t1.number)-1)%500 as varchar(100)) as N
from master..spt_values t1
cross join master..spt_values t2
最简单的方法是使用计算列将
BatchNo
/BatchSequenceNo
数字基于BatchId
CREATE TABLE #tblBatch(
BatchId INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
Sname VARCHAR(50) NOT NULL,
BatchNo as (BatchId-1) / 500 + 1,
BatchSequenceNo as BatchId % 500
)
雷克斯测试仪:
结果:
+------+-------+--------------------+--------------------+------------+---------+
| minN | maxN | minBatchSequenceNo | maxBatchSequenceNo | BatchCount | BatchNo |
+------+-------+--------------------+--------------------+------------+---------+
| 1 | 500 | 1 | 500 | 500 | 1 |
| 501 | 1000 | 1 | 500 | 500 | 2 |
| 1001 | 1500 | 1 | 500 | 500 | 3 |
| 1501 | 2000 | 1 | 500 | 500 | 4 |
| 2001 | 2010 | 1 | 10 | 10 | 5 |
+------+-------+--------------------+--------------------+------------+---------+
+------+-------+--------------------+--------------------+------------+---------+
| minN | maxN | minBatchSequenceNo | maxBatchSequenceNo | BatchCount | BatchNo |
+------+-------+--------------------+--------------------+------------+---------+
| 1 | 500 | 1 | 500 | 500 | 1 |
| 501 | 1000 | 1 | 500 | 500 | 2 |
| 1001 | 1500 | 1 | 500 | 500 | 3 |
| 1501 | 2000 | 1 | 500 | 500 | 4 |
| 2001 | 2500 | 1 | 500 | 500 | 5 |
| 2501 | 3000 | 1 | 500 | 500 | 6 |
| 3001 | 3500 | 1 | 500 | 500 | 7 |
| 3501 | 4000 | 1 | 500 | 500 | 8 |
| 4001 | 4500 | 1 | 500 | 500 | 9 |
| 4501 | 5000 | 1 | 500 | 500 | 10 |
| 5001 | 5500 | 1 | 500 | 500 | 11 |
| 5501 | 6000 | 1 | 500 | 500 | 12 |
| 6001 | 6500 | 1 | 500 | 500 | 13 |
| 6501 | 7000 | 1 | 500 | 500 | 14 |
| 7001 | 7500 | 1 | 500 | 500 | 15 |
| 7501 | 8000 | 1 | 500 | 500 | 16 |
| 8001 | 8500 | 1 | 500 | 500 | 17 |
| 8501 | 9000 | 1 | 500 | 500 | 18 |
| 9001 | 9500 | 1 | 500 | 500 | 19 |
| 9501 | 10000 | 1 | 500 | 500 | 20 |
+------+-------+--------------------+--------------------+------------+---------+
测试仪设置:
结果:
+------+-------+--------------------+--------------------+------------+---------+
| minN | maxN | minBatchSequenceNo | maxBatchSequenceNo | BatchCount | BatchNo |
+------+-------+--------------------+--------------------+------------+---------+
| 1 | 500 | 1 | 500 | 500 | 1 |
| 501 | 1000 | 1 | 500 | 500 | 2 |
| 1001 | 1500 | 1 | 500 | 500 | 3 |
| 1501 | 2000 | 1 | 500 | 500 | 4 |
| 2001 | 2010 | 1 | 10 | 10 | 5 |
+------+-------+--------------------+--------------------+------------+---------+
+------+-------+--------------------+--------------------+------------+---------+
| minN | maxN | minBatchSequenceNo | maxBatchSequenceNo | BatchCount | BatchNo |
+------+-------+--------------------+--------------------+------------+---------+
| 1 | 500 | 1 | 500 | 500 | 1 |
| 501 | 1000 | 1 | 500 | 500 | 2 |
| 1001 | 1500 | 1 | 500 | 500 | 3 |
| 1501 | 2000 | 1 | 500 | 500 | 4 |
| 2001 | 2500 | 1 | 500 | 500 | 5 |
| 2501 | 3000 | 1 | 500 | 500 | 6 |
| 3001 | 3500 | 1 | 500 | 500 | 7 |
| 3501 | 4000 | 1 | 500 | 500 | 8 |
| 4001 | 4500 | 1 | 500 | 500 | 9 |
| 4501 | 5000 | 1 | 500 | 500 | 10 |
| 5001 | 5500 | 1 | 500 | 500 | 11 |
| 5501 | 6000 | 1 | 500 | 500 | 12 |
| 6001 | 6500 | 1 | 500 | 500 | 13 |
| 6501 | 7000 | 1 | 500 | 500 | 14 |
| 7001 | 7500 | 1 | 500 | 500 | 15 |
| 7501 | 8000 | 1 | 500 | 500 | 16 |
| 8001 | 8500 | 1 | 500 | 500 | 17 |
| 8501 | 9000 | 1 | 500 | 500 | 18 |
| 9001 | 9500 | 1 | 500 | 500 | 19 |
| 9501 | 10000 | 1 | 500 | 500 | 20 |
+------+-------+--------------------+--------------------+------------+---------+
我希望你喜欢这样:
WITH cte_Tally AS (
SELECT
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) n
FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) a(n) --10
CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) b(n) -- 100
CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) c(n) -- 1,000
CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) d(n) -- 10,000
)
SELECT ROW_NUMBER() OVER (PARTITION BY n % 500 ORDER BY n) AS [Sequence], n % 500 AS [Sequence], n
FROM cte_Tally
ORDER BY n
您使用的是什么版本的sql server?避免某些编码的一个好方法是使用序列(来自sql server 2012)。请注意,基于
Row_Number()
计算值的各种答案将具有BatchNo
和BatchSequenceNo
的功能,如果删除行,这些答案将四处移动。Aducci的答案将基于行的主键提供稳定的结果。这太可怕了。使用交叉连接的组合来提供足够的行比暴力更糟糕。SQL中有数学运算符。您可以将某物乘以10,如下所示:*10