2016-05-31 191 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