繁体   English   中英

在SQL Server中查找丢失的多个数字序列

[英]Find Missing multiple numbers sequence in SQL server

我的桌子是这样的:

DrawDate    num    DrawName    etc...
2015-08-01  2      Draw 2
2015-08-01  3      Draw 3
2015-08-02  1      Draw 1
2015-08-02  2      Draw 2
2015-08-02  4      Draw 4
2015-08-03  3      Draw 3
2015-08-04  1      Draw 1
2015-08-04  2      Draw 2
2015-08-04  3      Draw 3
2015-08-04  4      Draw 4

我想获取表中缺少的序列号(num列)。 我怎样才能做到这一点?

我找到了很多解决方案,但是有一些缺点,即不包括起始编号或对序列的第一个和最后一个编号进行硬编码。 但是我无法对任何值进行硬编码。 起始值由1指定,但未定义结束序列。 它可以是上表中的4,或者在某些情况下可以是18或20,但是我需要通过drawdate最大值(最后一个)查找重复项。

编辑

最终结果将是

DrawDate    missingnum   
2015-08-01    1     
2015-08-02    3      
2015-08-03    1      
2015-08-03    2      

让我猜猜:

declare @t table 
(
    DrawDate    date,
    Num         int
)

insert into @t values
('2015-08-01' ,  2 ),
('2015-08-01' ,  3 ),
('2015-08-02' ,  1 ),
('2015-08-02' ,  2 ),
('2015-08-02' ,  4 ),
('2015-08-03' ,  3 ),
('2015-08-04' ,  1 ),
('2015-08-04' ,  2 ),
('2015-08-04' ,  3 ),
('2015-08-04' ,  4 );


with AvailableDates as
(
    select distinct DrawDate from @t
),
AvailableNumbers as
(
    select distinct Num from @t
),
CrossJoined as
(
    select
        DrawDate,
        Num
    from    
        AvailableDates
        cross join AvailableNumbers
)
select
    *
from
    CrossJoined cj
    left join @t t on t.DrawDate = cj.DrawDate and t.Num = cj.Num
where
    t.Num is null;

编辑

第二个猜测(在评论阅读之后):

with MaxNumberPerDate as
(
    select DrawDate, MaxNum = max(Num) from @t group by DrawDate
),
N as 
(
    select n from (values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) t(n)    
),
Multiplied as
(
    select
        DrawDate,
        Num     =   N.n
    from    
        MaxNumberPerDate md
        inner join N on N.n <= md.MaxNum
)
select
    m.*
from
    Multiplied m
    left join @t t on t.DrawDate = m.DrawDate and t.Num = m.Num
where
    t.Num is null;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM