Sql server TSQL-缺少月份
我需要在一张桌子上找到丢失的月份 关于每个ID_编号的最早和最晚开始日期,例如:Sql server TSQL-缺少月份,sql-server,Sql Server,我需要在一张桌子上找到丢失的月份 关于每个ID_编号的最早和最晚开始日期,例如: create table #InputTable (ID_No int ,OccurMonth datetime) insert into #InputTable (ID_No,OccurMonth) select 10, '2007-11-01' Union all select 10, '2007-12-01' Union all select 10, '2008-01-01' Union all sele
create table #InputTable (ID_No int ,OccurMonth datetime)
insert into #InputTable (ID_No,OccurMonth)
select 10, '2007-11-01' Union all
select 10, '2007-12-01' Union all
select 10, '2008-01-01' Union all
select 20, '2009-01-01' Union all
select 20, '2009-02-01' Union all
select 20, '2009-04-01' Union all
select 30, '2010-05-01' Union all
select 30, '2010-08-01' Union all
select 30, '2010-09-01' Union all
select 40, '2008-03-01'
对于上表,答案应为:
ID_No OccurMonth
----- ----------
20 2009-02-01
30 2010-06-01
30 2010-07-01
本网站上发布的其他解决方案类似,但:
1不包括ID列,
2不要在数据表中使用开始日期/结束日期,或
3使用我的环境中禁止使用的游标。尝试以下操作:
;WITH
MonthRange AS
(
SELECT ID_No,
MinMonth = MIN(OccurMonth),
MaxMonth = MAX(OccurMonth)
FROM #InputTable
GROUP BY ID_No
),
AllMonths AS
(
SELECT ID_No,
OccurMonth = MinMonth
FROM MonthRange
UNION ALL
SELECT a.ID_No,
DATEADD(MONTH, 1, a.OccurMonth)
FROM AllMonths a
INNER JOIN MonthRange r ON a.ID_No = r.ID_No
WHERE a.OccurMonth < r.MaxMonth
)
SELECT a.*
FROM AllMonths a
LEFT JOIN #InputTable i ON a.ID_No = i.ID_No
AND a.OccurMonth = i.OccurMonth
WHERE i.ID_No IS NULL
OPTION (MAXRECURSION 0)
AllMonths是一个递归的CTE,它列出了每个ID_no的最小月份和最大月份之间的所有月份。然后,它只是一个简单的左连接来查找中间缺少的月份