0

我有一张item_prices价格表。这些价格随时变化。

我想显示日期最高的所有项目

ITEM_prices

id | Items_name | item_price | item_date
------------------------------------------
1        A          10         2012-01-01
2        B          15         2012-01-01
3        B          16         2013-01-01
4        C          50         2013-01-01
5        A          20         2013-01-01

我想以最高日期显示一次 ABC 项目,如下所示

id | Items_name | item_price | item_date
-------------------------------------------
3        B          16         2013-01-01
4        C          50         2013-01-01
5        A          20         2013-01-01
4

4 回答 4

1

当您可以使用本机功能时,为什么要使用任何窗口功能或 CTE。

    SELECT t1.*
    FROM ITEM_prices t1
    JOIN
    (
        SELECT Items_name,MAX(item_date) AS MaxItemDate
        FROM ITEM_prices
        GROUP BY Items_name
    )t2
        ON t1.Items_name=t2.Items_name AND t1.item_date=t2.MaxItemDate
于 2013-10-29T16:35:19.673 回答
1

如果您使用的是 SQL Server 2005 及更高版本(您在这方面不够具体),则一种方法是使用 CTE(通用表表达式)。

使用此 CTE,您可以按某些标准(即您的)对数据进行分区,Items_name并让 SQL Server 为每个“分区”从 1 开始为您的所有行编号,并按某些标准排序。

所以尝试这样的事情:

;WITH NewestItem AS
(
   SELECT 
       id, Items_name, item_price, item_date,
       RowNum = ROW_NUMBER() OVER(PARTITION BY Items_name ORDER BY item_date DESC) 
   FROM 
       dbo.ITEM_Prices
)
SELECT 
   id, Items_name, item_price, item_date
FROM 
   NewestItem
WHERE
   RowNum = 1

在这里,我只为每个“分区”(即每个Items_Name)选择“第一个”条目 - 按item_date降序排序(最新日期获取 RowNum = 1)。

这是否接近你正在寻找的东西?

于 2013-10-29T15:40:24.557 回答
0

一种方法是使用窗口函数来查找每个项目的最大日期:

select id, Items_name, item_price, item_date
from (select ip.*,
             max(item_date) over (partition by items_name) as max_item_date
      from item_prices
     ) ip
where item_date = max_item_date;
于 2013-10-29T15:36:50.870 回答
0

这将选择具有最大日期的所有行。

SELECT * 
FROM item_prices
WHERE item_date = (SELECT max(item_date) FROM item_prices)
ORDER BY ID

这将选择每个项目的所有行以及该项目的最大日期。

select id, Items_name, item_price, item_date
from (select items_name, max(item_date) max_item_date
      from item_prices
      group by items_name
     ) ip
where item_date = max_item_date and items_name = ip.items_name
于 2013-10-29T15:37:16.843 回答