SQL语法 - 分组依据...自定义聚合功能?

时间:2009-06-23 22:01:04

标签: sql sql-server sql-server-2005 group-by

我有这样的情况:

表: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年不等。我想选择今天或过去有效的价格(不是在未来!它还没有效果)。它必须是“最近的”有效价格。

有什么想法吗?

4 个答案:

答案 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; 

编辑:假设价格每天变化不超过一次,将查询更改为实际工作。

答案 1 :(得分: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

答案 2 :(得分:0)

我不知道答案,但我的猜测是你需要使用一个子查询,这可能会使它成为一个非常昂贵的查询。

使用代码中的所有数据可能更容易自行进行后处理。

答案 3 :(得分:0)

如果你做

应该有用

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