2016-05-31 148 views
0

我有,我输入产品(SlobID),这是获取产品的最新版本

SELECT  TemplateID, SlobID, FromYear, ToYear, MAX(ValidFrom) AS CurrentDate 
FROM   CommissionsPerTemplate AS CommissionsPerTemplate_1 
GROUP BY TemplateID, SlobID, FromYear, ToYear 
HAVING  (MAX(ValidFrom) <= GETDATE()) AND (TemplateID = 2) AND (SlobID = 743) 

结果我得到的是

TemplateID SlobID (From Year) (To year) Valid date 
2   743  1   1  2016-01-01 
2   743  1   99  2015-01-01 
2   743  2   99  2016-01-01 

困难的部分是数据表我们需要查询才能获取此产品的最新版本。 第1版(1/1/2015)如果从一年= 1到一年= 99 但在(2016年1月1日),这创造了第二个版本分路器年 从今年1至1和第2年至99。

所以对我来说正确的结果应该是以下

TemplateID SlobID (From Year) (To year) Valid date 
2   743  1   1  2016-01-01 
2   743  2   99  2016-01-01 

,但我对如何让这个不知道。 也许在2017年1月1日,新版本应该有逐年= 1到一年= 10,从年= 11年= 99或别的东西。

+3

我没有看到任何*非常高级*在这里。 – Parfait

+0

我建议增加一个where子句 –

+0

所以,你只是想摆脱1-99记录?为什么?如果2-99的记录真的是3-99呢?然后你错过了2-2的跨度。那么1-99记录是否需要减少到一个具有“2015-01-01”日期的2-2? –

回答

0

不知道这是否会为数据的其余部分工作,但如果你通过使用ROW_NUMBER代替组,并采取了“以今年”从分区由它为您的样本数据。

select * from 
(
SELECT  TemplateID, SlobID, FromYear, ToYear, ValidFrom As CurrentDate , row_number() over (partition by TemplateID, SlobID,FromYear order by ValidFrom desc) rowid 
FROM   CommissionsPerTemplate AS CommissionsPerTemplate_1 
where (TemplateID = 2) AND (SlobID = 743) 
) as x 
where rowid = 1 
+0

hm !!!它似乎工作。但我可以弄清楚这背后的逻辑。我会继续测试并让你知道 – Yannis

+0

感谢我的朋友它的工作。 – Yannis