TSQL从价格历史中返回价格变化的日期

时间:2012-04-11 15:54:50

标签: sql-server-2008

我有一个包含这4个字段的价格历史表

  1. 编号
  2. 日期
  3. 产品
  4. 价格
  5. 每件产品都有一天的记录。我正在尝试编写一个查询来返回每个产品起始价格的记录以及每次价格变化时的记录。

    我尝试按价格进行分组,但很明显,当价格变化时,这种情况会在以后更改,因为它只会返回1条记录。

    我已经编写了这个查询来生成我试图解决的样本数据

    CREATE TABLE #PriceHistory
    (
     [Id] INT IDENTITY,
     [Date] DATETIME ,
     [Product] NVARCHAR(30) ,
     [Price] MONEY 
    )
    
    INSERT INTO #PriceHistory([Date],[Product],[Price])
    SELECT '20120101', 'Tesco', 1.99
    UNION ALL
    SELECT '20120102', 'Tesco', 1.97
    UNION ALL
    SELECT '20120103', 'Tesco', 1.97
    UNION ALL
    SELECT '20120105', 'Tesco', 1.99
    UNION ALL
    SELECT '20120104', 'Tesco', 1.99
    UNION ALL
    SELECT '20120106', 'Tesco', 1.99
    UNION ALL
    SELECT '20120101', 'BP', 1.99
    UNION ALL
    SELECT '20120102', 'BP', 1.01
    UNION ALL
    SELECT '20120103', 'BP', 1.99
    
    SELECT * FROM #PriceHistory
    
    
    DROP TABLE #PriceHistory
    

    根据该样本数据,我期待的结果应为

    1 2012-01-01 Tesco 1.99
    2 2012-01-02 Tesco 1.97
    5 2012-01-04 Tesco 1.99
    9 2012-02-11 BP 1.99
    8 2012-02-20 BP 1.01
    

    关于实现这一目标的最佳方法的任何想法?

2 个答案:

答案 0 :(得分:1)

此查询以价格开头,并尝试以相同的价格查找同一产品的先前记录...如果相同价格的同一产品没有记录,则返回记录:

SELECT ph.* 
FROM 
    #PriceHistory ph 
    LEFT JOIN #PriceHistory ph2 ON
        ph.Product = ph2.Product
        AND ph.Price = ph2.Price
        AND ph2.Date = (
            SELECT MAX(ph3.Date)
            FROM #PriceHistory ph3
            WHERE 
                ph3.Product = ph.Product
                AND ph3.Date < ph.Date
            )
WHERE ph2.ID IS NULL

答案 1 :(得分:0)

测试不是很好,但试试这个:

SELECT DISTINCT P1.* FROM #PriceHistory P1
JOIN #PriceHistory P2 ON P1.Date = P2.Date + 1 
OR P1.Date in (SELECT MIN(Date) From #PriceHistory P3) 
WHERE P1.Product = P2.Product AND P1.Price <> P2.Price

相邻日期;相同的产品;不同的价格

[编辑以捕获“第一个”日期]