我有一张价格为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
答案 0 :(得分:1)
如果您使用的是SQL Server 2005及更新版(在这方面您不够具体),一种方法是使用CTE(公用表表达式)。
使用此CTE,您可以按照某些条件对数据进行分区 - 即Items_name
- 并为每个“分区”提供从1开始的所有行的SQL Server编号,按某些条件排序。
所以尝试这样的事情:
;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)。
这会接近你想要的吗?
答案 1 :(得分: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
答案 2 :(得分: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;
答案 3 :(得分: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