每天获得一批记录的最新记录

时间:2015-02-19 16:27:18

标签: sql-server

我需要查询我的日志表以查找价格何时上涨。如果价格在一天内增加了不止一次,我需要获得最新的价格只给我一个价格变化的项目的唯一行。

注意日期格式为:MM/DD/YYYY

示例数据:

ProductItem      ProductPrice     ProductDateChange
=====================================================
Salmon           2.54             01/05/2005 12:20:00
Tuna             3.67             01/05/2005 09:05:00
Salmon           2.67             01/06/2005 12:25:00
Salmon           1.98             01/05/2005 15:45:00

这4条记录是个别价格变动。您可以看到有两个Salmon行在同一天,但我只想要一个具有最新DateTime的行。

期望输出:

ProductItem      ProductPrice     ProductDateChange
=====================================================
Tuna             3.67             01/05/2005 09:05:00
Salmon           2.67             01/06/2005 12:25:00
Salmon           1.98             01/05/2005 15:45:00

2 个答案:

答案 0 :(得分:2)

假设您想要返回其他列,例如价格,使用WINDOW FUNCTION将为每个产品提供行号,并按更改日期时间更改订购日期。

排序DESC时,行WHERE LatestDailyPrice = 1会为您提供最后一次更改。或者,您可以使用APPLYTOP 1来获得相同的结果。

WITH LatestProductPrice AS
(
    SELECT
        ProductItem
        , ProductPrice
        , ProductDateChange
        , ROW_NUMBER() OVER(PARTITION BY ProductItem
                                         , CAST(ProductDateChange AS DATE)
                            ORDER BY ProductDateChange DESC) AS LatestDailyPrice

    FROM
        dbo.Product
)

SELECT
    *

FROM
    LatestProductPrice

WHERE
    LatestDailyPrice = 1

更新以下评论: 或者如果你不能使用Common Table Expression,那么这是完全相同的:

SELECT
    *

FROM
    (
        SELECT
            ProductItem
            , ProductPrice
            , ProductDateChange
            , ROW_NUMBER() OVER(PARTITION BY ProductItem
                                             , CAST(ProductDateChange AS DATE)
                                ORDER BY ProductDateChange DESC) AS LatestDailyPrice

        FROM
            dbo.Product
    ) AS LatestProductPrice

WHERE
    LatestDailyPrice = 1

答案 1 :(得分:-1)

这可能会有所帮助:

SELECT DISTINCT(ProductItem), 
       MAX(ProductDateChange) 
FROM Table
GROUP BY ProductItem

对于每个单独的产品项目,这将为您提供更改表中的最新日期时间值。