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