2

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

  1. ID
  2. 日期
  3. 产品
  4. 价格

每件产品都有记录。我正在尝试编写一个查询来返回每个产品的起始价格的记录以及每次价格变化的记录。

我尝试按价格分组,但很明显,当价格变化而不是稍后的日期变回时,这会中断,因为它只会返回 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

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

4

2 回答 2

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
于 2012-04-11T16:03:27.780 回答
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

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

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

于 2012-04-11T16:01:52.287 回答