使用SQL查找缺少的数字

时间:2015-09-03 11:20:33

标签: sql

在大型日志文件中,我有包含字段INVNO(invoice-number)的记录。
最低和最高值很容易找到,但看起来中间有些数字不存在。

任何人都有一个SQL技巧,可以分辨数字范围​​内哪些数字丢失?

3 个答案:

答案 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;