选择包含列的组最大值的行

时间:2014-07-16 17:27:36

标签: sql-server sql-server-2008

假设我有一个名为Item的表,其中包含在特定日期设置的具有价格的商品。

物品

id | date       | price
---+------------+------
1  | 2014-01-01 | 1.09
1  | 2014-03-15 | 1.19
2  | 2014-04-02 | 2.75
1  | 2014-07-28 | 0.99
2  | 2014-08-07 | 2.35
3  | 2014-10-21 | 3.90

现在我想选择每件商品的当前价格(每件商品的最后一条记录):

WITH lastChange AS (
    SELECT id, MAX(date) date
    FROM Item
    GROUP BY id
)

SELECT Item.id, Item.price
FROM Item
JOIN lastChange ON Item.id = lastChange.id AND Item.date = lastChange.date

,并提供:

id | price
---+------
1  | 0.99
2  | 2.35
3  | 3.90

我想知道是否有更好的方法来进行此选择。

1 个答案:

答案 0 :(得分:1)

窗口函数

WITH t AS (
  SELECT *
   ,MAX(date) OVER(PARTITION BY id) max_date_by_id
  FROM Item
)
SELECT *
FROM t
WHERE date = max_date_by_id

交叉申请

SELECT *
FROM Item t
CROSS APPLY (
  SELECT MAX(date) max_date_by_id
  FROM Item
  WHERE id = t.id
)
WHERE date = max_date_by_id