我有一个关于sql查询或最好的程序的问题,可以在SSIS包中运行,它会比较两个数据集,看看有什么不同。
我的数据集包括历史数据(versionid = 0)和预测/预算,其中versionid> 0.每次创建新的预测或预算时,都会添加新的版本代码(版本表max(versionid)+1或自动增量中的新行)。新预算数据每年创建1到2次,但预测每月至少创建一次。
我想要一个查询或最好的存储过程,可以从版本表中提取X最新预测和Y最新预算。有两个位列,一个是IsPrognosis(1/0),第二个是IsBudget(1/0)
当我提取新数据时,我必须将现有数据集DimVersion与新提取的数据进行比较
让我们说DimVersion包括这些整数id(H = hist,B = Bud,P = Prog)其中X = 6(保留6个最新预测和2个最新预算)
VersionId = {0(H),137(B),152(B),153(P),154(P),155(P),156(P),157(P),158(P) } => 158当前编程和152当前萌芽
这是DimVersion表,该测试中的源是相同的
| VersionId | Name | HistoryTo | IsBudget | IsHistory | IsPrognosis |
|----------- |---------------------- |----------- |---------- |----------- |------------- |
| 0 | History data | 200701 | 0 | 1 | 0 |
| 137 | October 2017 Budget | 201805 | 1 | 0 | 0 |
| 152 | October 2018 Budget | 201710 | 1 | 0 | 0 |
| 153 | Prognosis nov 2017 | 201805 | 0 | 0 | 1 |
| 154 | Prognosis dec 2017 | 201712 | 0 | 0 | 1 |
| 155 | Prognosis Jan 2018 | 201801 | 0 | 0 | 1 |
| 156 | Prognosis feb 2018 | 201802 | 0 | 0 | 1 |
| 157 | Prognosis mar 2018 | 201803 | 0 | 0 | 1 |
| 158 | Prognosis april 2018 | 201804 | 0 | 0 | 1 |
NB! historyTo列稍后使用,无需查找versionids。
案例:大多数情况下,只添加了一个新的versionid行,但可能会添加多个新的ID行,让我们说159(B)和160(P)
如果超过2个预算,将删除DimVersion中最老的芽(137)并添加新的159.对于预测我们应该有6个,所以如果超过6个删除最旧的153个并添加最新的160。
最终结果将是
| VersionId | Name | HistoryTo | IsBudget | IsHistory | IsPrognosis |
|----------- |---------------------- |----------- |---------- |----------- |------------- |
| 0 | History data | 200701 | 0 | 1 | 0 |
| 152 | October 2018 Budget | 201710 | 1 | 0 | 0 |
| 154 | Prognosis dec 2017 | 201712 | 0 | 0 | 1 |
| 155 | Prognosis Jan 2018 | 201801 | 0 | 0 | 1 |
| 156 | Prognosis feb 2018 | 201802 | 0 | 0 | 1 |
| 157 | Prognosis mar 2018 | 201803 | 0 | 0 | 1 |
| 158 | Prognosis april 2018 | 201804 | 0 | 0 | 1 |
| 159 | May 2019 Budget | 201805 | 1 | 0 | 0 |
| 160 | Prognosis may 2018 | 201805 | 0 | 0 | 1 |
删除137(B)和(150(P),并添加159和160
我的问题是: 针对版本源的第一个提取查询为我提供了最新的6个prog版本和2个budid版本(并且hist = 0,但我们可以忽略它,因为它总是在数据集中)。这将添加到临时表Table1中。然后必须将其与DimVersion中保留当前版本的版本进行比较。比较必须充其量只能找到要删除的版本ID,以及将添加到dimversion的新版本。 Versionids是递增的,因此它总是比昏暗版本中的max更高版本ID号
因此查询的完美结果集将是
| VersionId | Action |
|----------- |-------- |
| 137 | Delete |
| 153 | Delete |
| 159 | Add |
| 160 | Add |
当然,这里有很多方法可以提供良好的算法。当然之一是将所有行(删除,未更改,添加)放在结果集中。如果比较没有找到任何不同的结果,则为Action列
中的所有行设置空结果集或保持不变如果您有任何好的解决方案,请回答这篇文章
谢谢Geir