[英]How to check if the previous and next records are sequential in SQL
我有一个包含列的表(ID int,RECEIPT_BARCODE nvarchar(200),FK_CLOSURE bigint)
ID RECEIPT_BARCODE FK_CLOSURE
1 01020011304500190001 58100000010019
2 01020011304500190002 58100000010019
1 01020011404500200001 58100000010020
2 01020011404500200002 58100000010020
3 01020011404500200003 58100000010020
1 01020011504500210001 58100000010021
1 01020011604500220001 58100000010022
1 01020011604500230001 58100000010023
2 01020011604500230002 58100000010023
1 01020011604500250001 58100000010025
3 01020011604500250003 58100000010025
我们的程序会自动将销售额插入表格中。 该表的插入方式如下; 当FK_CLOSURE向上运行时,ID再次设置为“ 1”(如您在上面看到的),只要FK_CLOSURE不变,它就会连续进行。 当FK_CLOSURE再次更改时,ID设置为“ 1”。
所以问题是; 有时我们的销售程序会出错,并且不会插入销售,但是会增加ID值,如您在最后一行看到的那样。 在最后一行中,ID从1增加到3,没有2 ...
我想报告这种失败。 我尝试使用CURSOR,但无法管理。 有什么建议么 ?
您可以使用逻辑来比较行号和键之间的差异,如果差异发生变化,则ID号中会有一个空洞。 在您的情况下,差异可能应始终为零。 所以像这样:
create table #test (ID int, RECEIPT_BARCODE nvarchar(200),FK_CLOSURE bigint)
insert into #test values
(1, '01020011304500190001',58100000010019),
(2, '01020011304500190002',58100000010019),
(1, '01020011404500200001',58100000010020),
(2, '01020011404500200002',58100000010020),
(3, '01020011404500200003',58100000010020),
(1, '01020011504500210001',58100000010021),
(1, '01020011604500220001',58100000010022),
(1, '01020011604500230001',58100000010023),
(2, '01020011604500230002',58100000010023),
(1, '01020011604500250001',58100000010025),
(3, '01020011604500250003',58100000010025)
select
ID,
RECEIPT_BARCODE,
FK_CLOSURE,
ID - row_number() over(partition by FK_CLOSURE order by ID asc)
from #test
结果将是:
1 01020011304500190001 58100000010019 0
2 01020011304500190002 58100000010019 0
1 01020011404500200001 58100000010020 0
2 01020011404500200002 58100000010020 0
3 01020011404500200003 58100000010020 0
1 01020011504500210001 58100000010021 0
1 01020011604500220001 58100000010022 0
1 01020011604500230001 58100000010023 0
2 01020011604500230002 58100000010023 0
1 01020011604500250001 58100000010025 0
3 01020011604500250003 58100000010025 1
试试这个查询
declare @SalesTable table (ID int, RECEIPT_BARCODE nvarchar(200),FK_CLOSURE bigint)
insert into @SalesTable values
(1, '01020011304500190001',58100000010019),
(2, '01020011304500190002',58100000010019),
(1, '01020011404500200001',58100000010020),
(2, '01020011404500200002',58100000010020),
(3, '01020011404500200003',58100000010020),
(1, '01020011504500210001',58100000010021),
(1, '01020011604500220001',58100000010022),
(1, '01020011604500230001',58100000010023),
(2, '01020011604500230002',58100000010023),
(1, '01020011604500250001',58100000010025),
(3, '01020011604500250003',58100000010025)
select
FK_CLOSURE
from @SalesTable
group by FK_CLOSURE
having count(distinct ID) != MAX(ID)
当任何FK_CLOSURE缺少某些ID时,则该FK_CLOSURE的count(distinct ID)
唯一count(distinct ID)
小于MAX(ID)
输出
FK_CLOSURE
58100000010025
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.