запрос для MSSQL
От: Dezmond  
Дата: 12.12.06 08:00
Оценка:
База данных MSSQL

есть таблица с полями:
тип цены, дата цены, цена

Нужен запрос, который возвращает последнюю по дате цену для каждого типа
Re: запрос для MSSQL
От: DarkSid Россия  
Дата: 12.12.06 08:30
Оценка: 3 (1)
Здравствуйте, 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
Re[2]: запрос для MSSQL
От: Dezmond  
Дата: 12.12.06 08:40
Оценка:
Здравствуйте, 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, т.к. она разная может быть для каждого типа цен
Re: запрос для MSSQL
От: Lloyd Россия  
Дата: 12.12.06 09:10
Оценка: 3 (1)
Здравствуйте, Dezmond, Вы писали:

D>есть таблица с полями:

D>тип цены, дата цены, цена

D>Нужен запрос, который возвращает последнюю по дате цену для каждого типа


SELECT цена
FROM таблица t1
WHERE 
    NOT EXISTS(SELECT * FROM таблица t2 WHERE t2.[тип цены] = t1.[тип цены] AND t2.[дата цены] > t1.[дата цены])
    AND [тип цены] = @тип_цены
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: запрос для MSSQL
От: DarkSid Россия  
Дата: 12.12.06 09:25
Оценка:
Здравствуйте, 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, т.к. она разная может быть для каждого типа цен


Внутренний запрос возвращает для каждого типа цен свою максимальную дату
Re: запрос для MSSQL
От: -FeofaN- Россия  
Дата: 12.12.06 09:27
Оценка:
Здравствуйте, Dezmond, Вы писали:

D>База данных MSSQL


D>есть таблица с полями:

D>тип цены, дата цены, цена

D>Нужен запрос, который возвращает последнюю по дате цену для каждого типа


select т1.тип цены, т1.цена from таблица т1
where
т1.дата цены = (select max(т2.дата цены) from таблица т2 where т2.тип цены = т1.тип цены)
Re: запрос для MSSQL
От: Андрийко Украина  
Дата: 12.12.06 09:32
Оценка: +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.ДатаЦены <= @НаДату

ЦЫ: хинты применять по вашему усмотрению...

Вопрос, а где в вашей структуре код товара ?
Re[2]: запрос для MSSQL
От: Dezmond  
Дата: 13.12.06 11:19
Оценка:
А>Вопрос, а где в вашей структуре код товара ?

Я просто его не указал, т.к. к задаче он не относится
Re: запрос для MSSQL
От: Tigor Россия  
Дата: 14.12.06 18:44
Оценка:
Здравствуйте, 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
К сожалению, в действительности все выглядит иначе, чем на самом деле.
Re[2]: запрос для MSSQL
От: Tigor Россия  
Дата: 14.12.06 18:46
Оценка: +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
К сожалению, в действительности все выглядит иначе, чем на самом деле.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.