2012-04-11 18 views
2

価格履歴から価格変更の日付を返すためにTSQLは、私はこれらの4つのフィールドを持っている価格履歴テーブルを持つ

  1. 同上
  2. 製品
  3. 価格

すべての製品に一日の記録があります。私は、価格が変わったたびにレコードごとに各製品の開始価格のレコードを返すためのクエリを作成しようとしています。

価格でグループ化しようとしましたが、後で価格が変更されたときにこれが壊れてしまうのは明らかに1レコードしか返されないからです。私は私が期待していた結果が

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 

上の任意のアイデアである必要があり、私はそのサンプルデータから

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 

をオフに動作するようにしようとしているサンプルデータを生成するには、このクエリを書いている

これを達成する最善の方法は?

+0

結果は1,2,5,7,8,9となるはずですか? –

+0

申し訳ありませんが、私は日付で発注したはずです。とにかく、ほとんどの場合、それは日付順になっていますが、私はサンプル中のいくつかの不具合を投げ捨ててしまいました。 – Gavin

答えて

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 
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 

隣接する日数を、同じ製品;異なる価格

[「最初」の日付をキャプチャするEDIT]

関連する問題