好像你只是想找到失踪的几个月,而且U
可以将其与一个整数比1
更大,在这种情况下,你需要使用U
找到这个失踪的日期开始时只是被忽略如果U
已在1
开始,那么这将会存在。
如果你需要在U
找到缺失的数字,这将不得不进行修改,因为它只关注缺失的日期。
鉴于数据:
declare @data table (Country varchar(10), U int, [Date] date)
insert into @data values
('USA', 1, '1/1/2015'),
('USA', 2, '2/1/2015'),
('USA', 3, '3/1/2015'),
('USA', 5, '5/1/2015'),
('USA', 6, '6/1/2015'),
('USA', 7, '7/1/2015'),
('USA', 8, '8/1/2015'),
('USA', 9, '9/1/2015'),
('Germany', 2, '4/1/2015'),
('Germany', 3, '5/1/2015'),
('Germany', 4, '6/1/2015'),
('Germany', 5, '7/1/2015'),
('Germany', 6, '8/1/2015'),
('Germany', 7, '9/1/2015'),
('Canada', 1, '3/1/2015'),
('Canada', 2, '4/1/2015'),
('Canada', 3, '6/1/2015'),
('Canada', 4, '7/1/2015')
您可以使用两个查询打造min
和max
日期为每个国家的列表,然后生成应该存在于每个国家的日期的完整列表。
select Country, dateadd(month, (-1 * min(U)) + 1, min([Date])) as min_Date, max([Date]) as max_Date
into #min_max
from @data
group by Country
;with cte (Country, [Date]) as (
select Country, min_Date from #min_max
union all
select cte.Country, dateadd(month, 1, cte.Date) from #min_max t inner join cte on t.Country = cte.Country where cte.[Date] < t.max_Date
)
select *
into #ranges
from cte
如果我们考察在#min_max
和#ranges
数据,你会看到以下内容:
select * from #min_max
Country min_Date max_Date
---------- ---------- ----------
Canada 2015-03-01 2015-07-01
Germany 2015-03-01 2015-09-01
USA 2015-01-01 2015-09-01
select * from #ranges order by 1, 2
Country Date
---------- ----------
Canada 2015-03-01
Canada 2015-04-01
Canada 2015-05-01
Canada 2015-06-01
Canada 2015-07-01
Germany 2015-03-01
Germany 2015-04-01
Germany 2015-05-01
Germany 2015-06-01
Germany 2015-07-01
Germany 2015-08-01
Germany 2015-09-01
USA 2015-01-01
USA 2015-02-01
USA 2015-03-01
USA 2015-04-01
USA 2015-05-01
USA 2015-06-01
USA 2015-07-01
USA 2015-08-01
USA 2015-09-01
那么很简单找到#ranges
没有在原始数据存在的记录:
select *
from #ranges r
where not exists (
select 1
from @data d
where r.Country = d.Country
and r.[Date] = d.[Date]
)
Country Date
---------- ----------
Germany 2015-03-01
USA 2015-04-01
Canada 2015-05-01
然后我们放弃我们的临时表:
drop table #min_max, #ranges
你可以拥有的最大“U”是多少? –
那么你的预期结果是什么?你不能返回不存在的值 – Mihai
@vkp最大U会是9.最大日期应该是今天的月份。 – gh0st