2009-06-23 39 views
1

我有這樣的情況:SQL語法 - 分組依據...自定義聚合功能?

表:FunTable

ItemKey  ItemName  ItemPriceEffectiveDate ItemPrice 
11   ItemA  6/6/2009     $500 
12   ItemA  6/15/2009     $550 
13   ItemA  9/9/2009     $450 
14   ItemB  3/9/2009     $150 
15   ItemB  9/9/2009     $350 

我需要做到以下幾點:

Select 
    ItemName as ItemDescription, 
    (SELECT THE PRICE WITH THE LATEST EFFECTIVE DATE FROM TODAY THROUGH THE PAST) 
FROM 
    FunTable 
GROUP BY 
    ItemName 

輸出應該是這樣的:

ItemA $550 
ItemB $150 

因此,價格的生效日期可以從5年前到現在5年不等。我想選擇今天或過去有效的價格(不是未來!它還沒有效果)。這應該是「最新」的有效價格。

有什麼想法?

回答

2

像這樣的東西(沒有你的名字,但你的想法)...

WITH A (Row, Price) AS 
(
    SELECT Row_Number() OVER (PARTITION BY Item ORDER BY Effective DESC) AS [RN], 
     Price FROM Table2 
    WHERE Effective <= GETDATE() 
) 
SELECT * FROM A WHERE A.Row = 1 
0

我不知道我的頭頂上的答案,但我的猜測是,你的意思是需要使用子查詢,這可能會使它成爲一個非常昂貴的查詢。

將使用代碼中的所有數據自行後處理可能更容易。

2
select ft.ItemName, 
     price 
from (select ItemName, 
       Max(ItemPriceEffectiveDate) as MaxEff 
     from  FunTable 
     where ItemPriceEffectiveDate <= GETDATE() 
     group by ItemName) as d, 
     FunTable as ft 
where d.MaxEff = ft.ItemPriceEffectiveDate; 

編輯:更改查詢實際工作,假設價格每天不會超過一次。

+0

我會說這是最優雅的解決方案 – 2009-06-23 22:27:48

0

應該工作,如果你做

SELECT ItemName, MAX(ItemPriceEffectiveDate) 
FROM FunTable 
WHERE ItemPriceEffectiveDate < getDate() 
GROUP BY ItemName 
+0

你也想要得到的價格。這意味着你需要按價格分組。這不會給你你需要什麼(除非價格永遠不會改變:) – nos 2009-06-23 22:21:12

+0

是的,這是正確的 – 2009-06-23 22:25:25