簡體   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