Мне нужно запросить таблицу для последней версии записи для всех доступных дат (конец дневного времени). Пример ниже иллюстрирует то, чего я пытаюсь достичь.Эффективный запрос для последней версии записи с использованием 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
Последующие действия: Таблица может содержать тысячи ItemIdentifiers, каждый из которых содержит данные о ценах на ценные бумаги. Историческая версия данных должна быть сохранена для целей аудита. Скажем, я запрашиваю таблицу и использую данные в отчете. Я храню @MRID = Max(RowID)
на момент создания отчета. Теперь, если цена для «ABC» в «2016-03-16» будет исправлена в более поздний срок, я могу изменить запрос с помощью @MRID и реплицировать отчет, который я запускал ранее.
Почему вы делаете объединение? Не выбрано ли сверху 1 достаточно? –
Благодарим вас за размещение данных ddl и образцов. Это облегчает помощь SO MUCH. Я бы хотел, чтобы все следовали за вами так! –