Здравствуйте, Dezmond, Вы писали:
D>База данных MSSQL
D>есть таблица с полями: D>тип цены, дата цены, цена
D>Нужен запрос, который возвращает последнюю по дате цену для каждого типа
Что Типа
Select T1.WareCode, PriceRUB
FROM PricesRegionHistory T0 (NOLOCK) INNER JOIN
(
SELECT WareCode, MAX(PriceHistoryDate) AS MaxDate
FROM dbo.PricesRegionHistory T1 (NOLOCK)
GROUP BY WareCode
) T1 ON T0.WareCode = T1.WareCode AND T0.PriceHistoryDate = T1.MaxDate
Здравствуйте, DarkSid, Вы писали:
DS>Здравствуйте, Dezmond, Вы писали:
D>>База данных MSSQL
D>>есть таблица с полями: D>>тип цены, дата цены, цена
D>>Нужен запрос, который возвращает последнюю по дате цену для каждого типа
DS>Что Типа
DS>
DS>Select T1.WareCode, PriceRUB
DS>FROM PricesRegionHistory T0 (NOLOCK) INNER JOIN
DS> (
DS> SELECT WareCode, MAX(PriceHistoryDate) AS MaxDate
DS> FROM dbo.PricesRegionHistory T1 (NOLOCK)
DS> GROUP BY WareCode
DS> ) T1 ON T0.WareCode = T1.WareCode AND T0.PriceHistoryDate = T1.MaxDate
DS>
Проблема в том, что нельзя использовать MaxDate, т.к. она разная может быть для каждого типа цен
Здравствуйте, Dezmond, Вы писали:
D>есть таблица с полями: D>тип цены, дата цены, цена
D>Нужен запрос, который возвращает последнюю по дате цену для каждого типа
SELECT цена
FROM таблица t1
WHERE
NOT EXISTS(SELECT * FROM таблица t2 WHERE t2.[тип цены] = t1.[тип цены] AND t2.[дата цены] > t1.[дата цены])
AND [тип цены] = @тип_цены
Здравствуйте, Dezmond, Вы писали:
D>Здравствуйте, DarkSid, Вы писали:
DS>>Здравствуйте, Dezmond, Вы писали:
D>>>База данных MSSQL
D>>>есть таблица с полями: D>>>тип цены, дата цены, цена
D>>>Нужен запрос, который возвращает последнюю по дате цену для каждого типа
DS>>Что Типа
DS>>
DS>>Select T1.WareCode, PriceRUB
DS>>FROM PricesRegionHistory T0 (NOLOCK) INNER JOIN
DS>> (
DS>> SELECT WareCode, MAX(PriceHistoryDate) AS MaxDate
DS>> FROM dbo.PricesRegionHistory T1 (NOLOCK)
DS>> GROUP BY WareCode
DS>> ) T1 ON T0.WareCode = T1.WareCode AND T0.PriceHistoryDate = T1.MaxDate
DS>>
D>Проблема в том, что нельзя использовать MaxDate, т.к. она разная может быть для каждого типа цен
Внутренний запрос возвращает для каждого типа цен свою максимальную дату
Здравствуйте, Dezmond, Вы писали:
D>База данных MSSQL
D>есть таблица с полями: D>тип цены, дата цены, цена
D>Нужен запрос, который возвращает последнюю по дате цену для каждого типа
select т1.тип цены, т1.цена from таблица т1
where
т1.дата цены = (select max(т2.дата цены) from таблица т2 where т2.тип цены = т1.тип цены)
Здравствуйте, Dezmond, Вы писали:
D>База данных MSSQL
D>есть таблица с полями: D>тип цены, дата цены, цена
D>Нужен запрос, который возвращает последнюю по дате цену для каждого типа
Если имеется таблица типов цен, томожно примерно так
select
КодТипаЦены,
(select top 1 b.Цена from ЦеныПоДатам as b where b.КодТипаЦены = a.КодТипаЦены order by b.ДатаЦены desc)
from ТипыЦен as a
с учетом того что типов цен много не бывает (в моем понимани не много <100)
и при этом имея составной индекс (а если по одному типу не может быть несколько цен на одну дату — можно сделать его первичным и кластерным) на поля КодТипаЦены, ДатаЦены можно получить довольнотаки эффективную выборку.
При этом можно дописать запрос для решения задачи получения цены не только для типа но и на заданную дату (обычно историю изменения цен для этого и ведут) — добавить условия b.ДатаЦены <= @НаДату
Здравствуйте, Dezmond, Вы писали:
D>База данных MSSQL
D>есть таблица с полями: D>тип цены, дата цены, цена
D>Нужен запрос, который возвращает последнюю по дате цену для каждого типа
Для MSSQL 2005:
select
amount,
price_type_id
from
(
select
amount,
price_type_id,
rank() over(partition by price_type_id order by create_time desc) as rank
from
PRICE
)
where
rank = 1
К сожалению, в действительности все выглядит иначе, чем на самом деле.
select
amount,
price_type_id
from
(
select
amount,
price_type_id,
rank() over(partition by price_type_id order by create_time desc) as rank
from
PRICE
) ranked
where
rank = 1
К сожалению, в действительности все выглядит иначе, чем на самом деле.