【问题标题】:SQL Syntax -- Group By ... Custom Aggregate Functionality?SQL 语法——分组依据...自定义聚合功能?
【发布时间】:2010-11-05 08:23:47
【问题描述】:

我遇到了这样的情况:

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

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    类似的东西(没有你的名字,但你明白了)......

    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
    

    【讨论】:

    • 我相信这个答案是正确的,尽管我认为以下可能会更快一些:Select ItemName, ItemPrice from FunTable f INNER JOIN ( Select ItemKey, MAX(ItemPriceEffectiveDate) Date From FunTable Where ItemPriceEffectiveDate
    • 对不起格式不好,我不知道如何使它漂亮
    【解决方案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; 
    

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

    【讨论】:

    • 我会说这是最优雅的解决方案
    【解决方案3】:

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

    在使用代码中提取所有数据以自己进行后处理可能更容易。

    【讨论】:

      【解决方案4】:

      如果你这样做应该可以工作

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

      【讨论】:

      • 您也想知道价格。这意味着您需要按价格分组。这不会给你你需要的东西(除非价格永远不变:)
      猜你喜欢
      • 2010-09-08
      • 2020-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      相关资源
      最近更新 更多