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 に答える