2013-05-22 6 views
3

У меня есть любопытная проблема с расчетом, основанным на вычитании значения предыдущего дня с этого значения дня
Вот запрос. Выборочные данные и запрос результата hereрасчет mysql на основе предыдущей даты

SELECT pd.id,pd.price_date,pd.name_id,pd.class_id,pd.currency_id,pd.price, 
     pd.price - (SELECT price 
        FROM price_data as x 
        WHERE x.price_date < pd.price_date 
        AND x.name_id  = pd.name_id 
        AND x.class_id  = pd.class_id 
        AND x.currency_id = pd.currency_id 
     HAVING MAX(x.price_date)) as `change` 
     FROM price_data as pd 
     WHERE pd.name_id ='BILL' 

     ORDER bY pd.name_id,pd.class_id,pd.currency_id,pd.price_date  

Если вы посмотрите на результат набора вы увидите, что вычисление работает, пока первый не откажет в row 6. Кажется, он начинает добавлять предыдущее изменение к текущему изменению.

С чем связано определение даты?

ответ

0

Запрос, который вы хотите:

SELECT pd.id,pd.price_date,pd.name_id,pd.class_id,pd.currency_id,pd.price, 
     pd.price - (SELECT price 
        FROM price_data as x 
        WHERE x.price_date < pd.price_date 
        AND x.name_id  = pd.name_id 
        AND x.class_id  = pd.class_id 
        AND x.currency_id = pd.currency_id 
        order by x.price_date desc 
        limit 1 
        ) as `change` 
FROM price_data as pd 
WHERE pd.name_id ='BILL' 
ORDER bY pd.name_id,pd.class_id,pd.currency_id,pd.price_date; 

Что случилось с вашим исходным запросом? Ну, предложение having является нерабочим, потому что оно просто проверяет, что максимальная величина price_date не равна 0. Чтобы получить то, что вы хотите, вам необходимо заказать данные и принять одно значение, которое вас интересует.

+0

Спасибо, Гордон. – jimlongo