SQL Server — продукт и его последняя информация, требуемая из таблицы истории

У меня есть таблица Products со следующими столбцами

ProductId - INT - PK
Name - Varchar
Price Decimal

У меня есть другая таблица ProductPriceHistory

Когда цена продукта обновляется с помощью триггера, я сохраняю старые и новые цены в этой таблице. Эта таблица имеет следующие столбцы

ProductPriceHistoryId
Name
OldPrice
NewPrice
UpdateDate

Я могу присоединиться к этой таблице на основе столбцов Name.

Теперь вопрос в моем наборе результатов: я хочу получить Product.Name, Product.Price и (для получения последнего обновленного значения в таблице ProductPriceHistory) ProductPriceHistory.NewPrice.

Проблема заключается в том, что в таблице истории у меня есть много строк для каждого продукта на основе разных дат. Для каждого продукта мне нужно получить информацию из последней строки, сохраненной для этого продукта.


person shabber    schedule 03.03.2017    source источник


Ответы (2)


Стандартный способ SQL сделать это - объединить историческую таблицу с агрегацией самой себя, в которой для каждого продукта вы берете максимальную дату.

select  t1.Name, t1.Price, t2.NewPrice
from    Products t1
join    ProductPriceHistory t2
on      t1.Name = t2.name
join    (
          select  Name, max(UpdateDate) as MaxDate
          from    ProductPriceHistory
          group by Name
        ) t3
on      t2.Name = t3.Name and t2.UpdateDate = t3.MaxDate
person Stefano Zanini    schedule 03.03.2017

Вы должны сохранить ProductId в таблице истории, поскольку он уникален, а затем объединить таблицы по этому значению.

Затем упорядочите запрос по дате в порядке убывания, ограничьте 1 (или выберите поля Top 1 From...). Это даст вам только последнее обновление.

Изменить: структура вашей таблицы не нормализована. Для меня было бы более разумно, чтобы ваши таблицы были:

Products:
ProductId
Name
Description

Prices:
ProductId
Price
UpdateDate

Тогда ваш запрос будет таким:

 SELECT TOP 1 Products.ProductId, Products.Name, Prices.Price, Prices.UpdateDate FROM etc
person Stuart    schedule 03.03.2017
comment
Ограничение количества строк, возвращаемых запросом, не является стандартным SQL, его доступность зависит от СУБД. - person Stefano Zanini; 03.03.2017
comment
Отредактировано, чтобы включить Select Top... - person Stuart; 03.03.2017