2013-10-29 205 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 - 感謝提示 –