我有一个包含这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
关于实现这一目标的最佳方法的任何想法?
答案 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
相邻日期;相同的产品;不同的价格
[编辑以捕获“第一个”日期]