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