在大型日志文件中,我有包含字段INVNO(invoice-number)的记录。
最低和最高值很容易找到,但看起来中间有些数字不存在。
任何人都有一个SQL技巧,可以分辨数字范围内哪些数字丢失?
答案 0 :(得分:0)
对于oracle,这应该有效。对于任何其他数据库,您只需要更改生成数字序列的方式。
with vals as (
select rownum r
from dual
connect by rownum between {min} and {max}
)
select *
from vals v
left join {sometable} s on s.{someid} = v.r
where s.{someid} is null
诀窍就是在最小值和最大值之间生成数字,将表格与此生成序列的发票连接起来,并过滤掉匹配的所有内容。
答案 1 :(得分:0)
使用下表值函数,该函数有2个参数:最小和最大数, 并返回缺失号码列表, 假设您的表名是YOUR_TABLE,列名称为InvNo
create FUNCTION [dbo].[MissingInvoiceNumbers]
(
@minPaym bigint,
@MaxPaym bigint
)
RETURNS @tmp table(numbers bigint)
AS
BEGIN
declare @n bigint --@minPaym bigint , @MaxPaym bigint,
declare @tmpAll table(Allnumbers bigint)
set @n= @minPaym
delete @tmp
delete @tmpAll
while (@n<=@MaxPaym)
begin
INSERT INTO @tmpAll
(AllNUMBERS)
VALUES (@n)
set @n=@n+1
end
INSERT INTO @tmp
(numbers)
SELECT Allnumbers
FROM @tmpAll
where Allnumbers not in (select distinct convert(bigint,InvNo) as InvoiceNum from YOUR_TABLE where
InvNo <> '' )
return
END
答案 2 :(得分:-1)
只需加入桌子......
DECLARE @tvp TABLE ( INVNO INT )
INSERT INTO @tvp
VALUES ( 1 ),
( 2 ),
( 3 ),
( 5 ),
( 6 ),
( 7 ),
( 8 ),
( 9 ),
( 10 ),
( 11 )
SELECT *
FROM @tvp;
SELECT t.INVNO + 1
FROM @tvp t
LEFT OUTER JOIN @tvp x ON x.INVNO = t.INVNO + 1
WHERE ISNULL(x.INVNO, 0) = 0;