找出最小值和最大值之间的差距

时间:2015-01-29 15:56:21

标签: sql sql-server max min

两张桌子 由VoucherCode(可空int)和Scheme(bigint)组成的成员 Scheme-由schemeId(bigint),mincode(int),maxcode(int)

组成

我需要在最小和最大代码中找到成员的代金券中的任何空白。如果mincode为1且maxcode为10,并且现有的凭证代码为2,3和4则应该返回1.如果存在代码1,2和4,则应该返回3.如果存在1,2和3,则应该带回来。

这是我到目前为止所做的:

SELECT  MIN(ID + 1) FROM (
    SELECT mincode AS ID from Scheme as s UNION ALL 
    SELECT  
        MIN(vouchercode + 1)
    FROM    
        member mmm where mmm.voucherCode is not null
        ) AS T1
WHERE
    ID+1 NOT IN (SELECT vouchercode as ID FROM member m where voucherCode is not null) 

它适用但并非适用于所有3种情况。如果存在2,3和4,则它返回null而不是1. 1,3和4存在然后它返回2,正确!存在1,2和3,它带回null,而不是4.

1 个答案:

答案 0 :(得分:0)

以下是使用计数表执行此操作的一种方法。我在我的系统中有ctes的视图,但我在这里提取它们。如果需要,您可以将计数表扩展到更多行。

WITH
    E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
    E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
    E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
    cteTally(N) AS 
    (
        SELECT  ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
    )

select MIN(t.N)
from cteTally t
left join Scheme s on s.ID = t.N
where s.ID is null