[英]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.