Как построить новый столбец даты на основе предыдущего и последнего измененного значения? - PullRequest
0 голосов
/ 08 января 2020

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

Мой текущий набор данных выглядит следующим образом:

Product_id  Current_date    Price
2001         11/1/19         57
2001         11/2/19         57
2001         11/3/19         58
2001         11/20/19        58
2001         11/21/19        60
2001         11/22/19        60
2001         11/29/19        60
2001         11/30/19        72
2001         11/29/19        72
2001         11/30/19        72

И я хотел бы добавить новый столбец «измененная дата», который будет рассчитываться на основе - если цена не изменилась, верните предыдущую дату, если цена изменилась, верните текущую дату)

выглядит так:

product_id  current_date    Price   **Changed_Date** (if price did not change return previous 
                                                      date, 
                                                      if price changed return current date)
2001           11/1/19     57     11/1/19
2001           11/2/19     57     11/1/19
2001           11/3/19     58     11/3/19
2001           11/20/1     60     11/20/19
2001           11/21/19    60     11/20/19
2001           11/22/19    60     11/20/19
2001           11/29/19    60     11/20/19
2001           11/28/19    72     11/28/19
2001           11/29/19    72     11/28/19
2001           11/30/19    72     11/28/19

Может ли кто-нибудь помочь с идеями о лучших функциях, которые можно использовать в SQL, чтобы получить такой результат? Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 08 января 2020

Большое спасибо, ребята! @Gordon, я попробовал пример, который вы порекомендовали и который работает частично, и почему я говорю частично, что для некоторых строк не возвращает ожидаемых результатов, это может быть связано с тем, как выполняется переразметка?

см. Пример ниже:

product_id   current_date        price             changed date
2001         10/4/19              60                10/4/19
2001         10/6/19              60                10/4/19
2001         10/7/19              60                10/4/19
2001         10/12/19             60                10/4/19
2001         10/13/19             57                10/13/19
2001         10/18/19             57                10/13/19
2001         10/20/19             57                10/13/19
 -----did not work for the below dates (should have been 10/13/19 as changed date, because price did not change)                                                                  
2001        10/24/19              57                10/24/19                                         
2001        10/24/19              57                10/24/19
2001        10/25/19              57                10/24/19         

Есть предложения, как мне это изменить? Еще раз спасибо

0 голосов
/ 08 января 2020

В данных вашего примера цены только растут. Если это так, самый простой метод - это совокупный минимум:

select t.*,
       min(current_date) over (partition by product_id, price) as changed_date
from t;

Если это не так, особенно если цены могут вернуться к предыдущим ценам, у вас есть пробелы и острова проблема. Самым простым решением в этом случае, вероятно, является разница номеров строк:

select t.*,
       min(date) over (partition by product_id, price, (seqnum - seqnum_2)) as change_date
from (select t.*,
             row_number() over (partition by product_id order by current_date) as seqnum,
             row_number() over (partition by product_id, price order by current_date) as seqnum_2
      from t
     ) t;

Почему эту работу объяснить немного сложно. Но если вы посмотрите на результаты подзапроса, вы увидите, как разница в номерах строк идентифицирует соседние строки с одинаковой ценой.

...