kullanarak bir kaydın en son sürümü için verimli bir sorgu Sorgulama, tüm geçerli tarihler için (son günün saat dizisi sonu) bir kaydın son sürümü için bir tablo sorgular. Aşağıdaki örnek, elde etmeye çalıştığım şeyi göstermektedir.SQL
Sorunuz, tablo tasarımının (birincil anahtar vb.) Ve LEFT OUTER JOIN
sorgusunun bu hedefi en verimli şekilde gerçekleştirip gerçekleştirmediğidir.
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
Takip: Tablo fiyat verilerinin değerinde dacades ile ItemIdentifiers her binlerce içerebilir. Denetim nedenleriyle verilerin tarihsel sürümünün korunması gerekir. Tabloyu sorguladığımı ve verileri bir raporda kullandığımı varsayalım. Rapor oluşturulduğunda @MRID = Max(RowID)
depolarım. Şimdi '2016-03-16' tarihinde 'ABC' fiyatı sonraki bir tarihte düzeltilirse, @MRID kullanarak sorguyu değiştirebilir ve daha önce çalıştırdığım raporu çoğaltabilirim.
Neden katılmak yapıyorsun? İlk 1 yeterince seçilmiyor mu? –
ddl ve örnek verilerini gönderdiğiniz için teşekkür ederiz. Bu çok daha kolay yardımcı olur. Keşke herkesin bu şekilde olmasını isterdim! –