2016-11-10 4 views
2

Мне нужен запрос в таблице истории темной таблицы, чтобы найти последний раз, когда значение столбца изменилось и какова разница в сравнении с vs now. Как есть и другие изменения, которые также записаны в таблице мне нужно найти только изменение, где столбец данных изменились, то выяснить, сколько и когда он изменилms sql временная таблица найти историю в столбце, где последний изменен

моей temperal истории таблица выглядит следующим образом

 
Id  |Price   |LastModifiedDate |other data 
------ |---------------|------------------|-------- 
696733 |9995   |08/Nov/2016 09:30 |1 -other change 
696733 |9995   |06/Nov/2016 09:28 |2 -price change -current price 
696733 |10995   |30/Oct/2016 09:29 |2 -other change - prev price 
696733 |10995   |29/Oct/2016 09:29 |3 -other change 
696733 |10995   |26/Oct/2016 10:10 |4 -other change 
696733 |10995   |26/Oct/2016 08:42 |5 -other change 
696733 |10995   |25/Oct/2016 10:11 |6 -price change - 
696733 |11595   |22/Oct/2016 09:50 |6 -other change - old old price 
696733 |11595   |21/Oct/2016 15:26 |7 -other change 

Так что будьте готовы вернуть 9995 в качестве текущей цены и 10995 как предыдущую цену и дату изменения, так как 06/Ноябрь/2016 09:28 и игнорировать любые другие предыдущие изменения цен. Мне нужно будет затем фильтровать результаты, чтобы проверить, было ли это изменение 28 дней назад, поэтому необходимо, чтобы это было решение, которое я могу внести в подзапрос или перекрестное применение

Я пытался использовать «OVER (заказать», путем, чтобы избежать использования потери вложенных запросов

заранее спасибо

Редактировать

My SQL скрипку пример http://sqlfiddle.com/#!6/05db1/7

примечания SQL скрипка не зирр ORT temperal таблицы поэтому пришлось имитировать его немного

+1

Можете вы показать, что вы уже сделали? –

+0

уверен, что это далеко, хотя, пожалуйста, см. Выше –

ответ

1

Вы можете использовать OUTER APPLY с ORDER BY, чтобы получить самую последнюю запись истории, которая была другая цена, чем текущая цена (при условии, текущая цена в Pricing таблице).

SELECT 
    p.Id, 
    p.Price AS current_price, 
    ph.Price AS prev_price, 
    ph.LastModifiedDate AS prev_price_date 
FROM [Pricing] p 
    OUTER APPLY (
     SELECT TOP 1 ph1.Price, ph1.LastModifiedDate 
     FROM [PriceHistory] ph1 
     WHERE ph1.Id = p.Id 
      AND ph1.Price <> p.Price 
     ORDER BY ph1.LastModifiedDate DESC 
    ) AS ph 
+0

yer Я должен был использовать только порядок Мне удалось выбить пример скрипта sql (обратите внимание, что sql fiddle dosnt поддерживает температурные таблицы, поэтому ему пришлось немного имитировать): [ссылка] (http://sqlfiddle.com/#!6/05db1/7) используя то, что вы surgested мне удалось получить результаты correctg спасибо :) из intrest находится в там более efficant/(PARTITION BY "AND" MAX (OrderQty) OVER (PARTITION BY " –

+0

Я не тестировал, но не думаю, что изменение запроса использование 'ROW_NUMBER()' будет более эффективным и может привести к тому, что будет выполнен один и тот же план выполнения. для удобочитаемости, «ВНЕШНЯЯ ПРИМЕНИМОСТЬ» имеет смысл. Я думаю, что изменить его на использование 'ROW_NUMBER()' сделает его менее понятным, что вы пытаетесь выполнить. Есть ли причина, по которой вы хотите ее изменить? Одна вещь, которую вы можете сделать, это изменить 'OUTER APPLY' на' CROSS APPLY', если вы хотите только вернуть записи, которые имеют изменение цены. – jtate

+0

ok np просто хотел убедиться, что не было лучшего способа сделать это спасибо :) –

 Смежные вопросы

  • Нет связанных вопросов^_^