【问题标题】:Find gaps between a min and max查找最小值和最大值之间的间隙
【发布时间】:2015-03-28 22:24:11
【问题描述】:

两张桌子 由 VoucherCode (nullable 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 存在,那么它应该带回来4。

这是我目前所拥有的:

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。

【问题讨论】:

  • 使用计数表会非常简单。

标签: sql sql-server max min


【解决方案1】:

这是使用计数表执行此操作的一种方法。我的系统中有 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

【讨论】:

    猜你喜欢
    • 2016-11-04
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    相关资源
    最近更新 更多