2010-08-30 3 views
1

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

В исторической таблице у меня есть время начала и окончания цены, поэтому я могу выбрать самую последнюю цену, но как мне собрать все это вместе в одном запросе? Или мне нужно сделать подзапрос?

select p.current_price, 
h.historical_price 
h.historical_time 

from price p 

inner join price_history h 
on p.id = h.id 
where max(h.historical_time) 

Это, очевидно, не работает, но это то, что я пытаюсь выполнить.

Это дает мне текущую и историческую цену. Но я хочу убедиться, что у меня самая последняя цена. Как мне это сделать?

ответ

2

Я бы так сделал. Обратите внимание, что вы можете получить дубликаты записей, если есть две записи цен с той же датой для той же id в price_history:

select p.current_price, h.historical_price, 
    p.current_price - h.historical_price as PriceDeff, h.historical_time 
from price p 
inner join (
    select id, max(historical_time) as MaxHistoricalTime 
    from price_history 
    group by id 
) hm on p.id = hm.id 
inner join price_history h on hm.id = h.id 
    and hm.MaxHistoricalTime = h.historical_time 
+0

+1 писал то же самое сам –

+0

Работает отлично! Спасибо! – muncherelli

+0

Я могу добавить, даты на самом деле являются отметками времени ... поэтому, если цены не обновляются более одного раза, я должен быть хорош для дубликатов! ;) – muncherelli

1

Я не верю, что есть способ сделать это без подзапроса, который не хуже. С другой стороны, если ваша таблица индексирована правильно, подзапросы, возвращающие результаты агрегатных функций, как правило, довольно быстр.

+0

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

0
select 
     p.current_price, 
     h3.historical_price, 
     h3.historical_time 
    from 
     price p, 
     (select h1.id, max(h1.historical_time) as MaxHT 
      from price_history h1 
      group by 1) h2, 
     price_history h3 
    where 
      p.id = h2.id 
     and p.id = h3.id 
     and h2.MaxHT = h3.historical_time 
Смежные вопросы