2013-10-29 90 views
0

我有一个item_prices表的价格。这些价格随时变化。sql server select查询有点复杂

我要显示所有项目,其中日最高

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 

我想与像如下

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 

回答

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 
+0

这一个为我工作,但用t2.MaxItemDate替换上一个t2.item_date后谢谢你 –

+0

是的我的坏,查询未在虚拟模式上测试。我现在纠正了。 –

0

一个最高日各一次显示ABC项目方法是使用窗口函数查找每个项目的最大日期:

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; 
+0

你不需要加入items_name吗? – Hogan

+0

这不起作用,只是测试。你可以在发布前检查它吗? – EnterSB

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 
1

一种方法是使用一个CTE(公共表表达式),如果你的SQL Server 2005 和新(你是不是在这方面不够具体)上。

使用此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)。

这是否接近你要找的?

+0

请在RowNum前添加逗号 – EnterSB

+0

@EnterSB:done - 感谢提示 –