2009-06-23 44 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