sql server选择查询有点复杂

时间:2013-10-29 15:34:00

标签: sql sql-server select

我有一张价格为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 个答案:

答案 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
相关问题