我在一家经济咨询公司工作,我们所有的数据都保存在 SQL Server 11 (2012) 中。我们的数据基本上由一个日期列、一个原始数据列、几个计算列和一个具有用于区分每组数据和下一组数据的短代码的列组成。
我们有数千个这样的集合,它们都加载到同一个表中(总共约 250 万行),然后从查询中提取和排序。它们通常按日期排序,从第一个月开始,逐月移动到最后一个月。每个系列的开始和结束日期从一年到 100 多年不等。
最近,我们遇到了一些随机数据部分消失的问题。整行只是向上和离开,这使得找到这些丢失的行有点困难,而无需每个月都检查是否丢失了一个月,这对于 250 万行的表来说是一项有点不可能完成的任务。
我的老板让我编写一个查询/存储过程,它将查看这个巨大的表并查看哪些集合缺少行以及它们在哪里。
我一直在努力解决这个问题,这个问题有点超出我的 SQL 技能,我似乎无法在网络上的任何地方找到任何有类似问题的人。我将经历我已经拥有的东西,也许有人至少可以告诉我我是否朝着正确的方向前进,并可能提供一些关于我应该从哪里开始的见解。
我在网上找到的最佳解决方案是使用 CTE 创建一个临时日期表,然后将它们与原始表进行比较。如果我只是扫描一个特定数据集中的问题,这很有效,但我在同一个表中有许多数据集,所有数据集都有不同的开始和结束日期。所以我还是选择了它,希望我最终可以扩展它以搜索其中的很多。这是我的代码:
declare @startDate Date, @endDate Date
set @startDate = '2000-01-01'
set @endDate = '2016-11-01'
;with GetDates As
(
select @startDate as TheDate
UNION ALL
select DATEADD(MONTH,1, TheDate) from GetDates
where DATEADD(MONTH,1, TheDate) <= @endDate
)
SELECT TheDate,SHORTCODE,MonthYear
From GetDates
LEFT OUTER JOIN VWTBL_INDICATOR
ON GetDates.TheDate=VWTBL_INDICATOR.MonthYear
AND VWTBL_INDICATOR.SHORTCODE='RMI WEST'
OPTION(MAXRECURSION 1000)
Run Code Online (Sandbox Code Playgroud)
'RMI West' 将是标记此特定数据集的短代码,它缺少从 2004 年 11 月到 2005 年 3 …