利用可能なすべての日付(終わりの時系列)のレコードの最新バージョンのテーブルをクエリする必要があります。以下の例は私が達成しようとしていることを示しています。SQLを使用して最新バージョンのレコードを効率的にクエリする
私の質問は、テーブルのデザイン(主キーなど)とLEFT OUTER JOIN
クエリが最も効率的な方法でこの目標を達成しているかどうかです。
CREATE TABLE [PriceHistory]
(
[RowID] [int] IDENTITY(1,1) NOT NULL,
[ItemIdentifier] [varchar](10) NOT NULL,
[EffectiveDate] [date] NOT NULL,
[Price] [decimal](12, 2) NOT NULL,
CONSTRAINT [PK_PriceHistory]
PRIMARY KEY CLUSTERED ([ItemIdentifier] ASC, [RowID] DESC, [EffectiveDate] ASC)
)
INSERT INTO [PriceHistory] VALUES ('ABC','2016-03-15',5.50)
INSERT INTO [PriceHistory] VALUES ('ABC','2016-03-16',5.75)
INSERT INTO [PriceHistory] VALUES ('ABC','2016-03-16',6.25)
INSERT INTO [PriceHistory] VALUES ('ABC','2016-03-17',6.05)
INSERT INTO [PriceHistory] VALUES ('ABC','2016-03-18',6.85)
GO
SELECT
L.EffectiveDate, L.Price
FROM
[PriceHistory] L
LEFT OUTER JOIN
[PriceHistory] R ON L.ItemIdentifier = R.ItemIdentifier
AND L.EffectiveDate = R.EffectiveDate
AND L.RowID < R.RowID
WHERE
L.ItemIdentifier = 'ABC' and R.EffectiveDate is NULL
ORDER BY
L.EffectiveDate
フォローアップ:表は、価格データの価値dacadesでItemIdentifiers何千ものそれぞれを含むことができます。監査上の理由から、履歴バージョンのデータを保存する必要があります。テーブルにクエリを行い、レポート内のデータを使用するとします。レポートが生成された時点で私は@MRID = Max(RowID)
を保存しています。今すぐ 'ABC'の価格が'2016-03-16 'に修正されたら、@MRIDを使用してクエリを変更し、以前実行したレポートを複製できます。
は、なぜあなたは参加していますか?トップ1を選択するのに十分ですか? –
ddlとサンプルデータを投稿していただき、ありがとうございます。それはとても簡単に役立ちます。私は皆がこのようにあなたの指導に従うことを望む! –