обновить последнюю запись каждого кластера - PullRequest
0 голосов
/ 08 июня 2018

У меня есть таблица, и я уже создаю начальные значения для следующей даты в каждом кластере продуктов.В дополнение к этому я создал дельта-значение, которое отображает разницу между date и lead_date.

+---------+------------+------------+------------+
| Product |    Date    |  LeadDate  | delta_days |
+---------+------------+------------+------------+
| A       | 2018-01-15 | 2018-01-23 | 8          |
| A       | 2018-01-23 | 2018-02-19 | 27         |
| A       | 2018-02-19 | 2017-05-25 | -270       |
| B       | 2017-05-25 | 2017-05-30 | 5          |
| B       | 2017-05-30 | 2016-01-01 | -515       |
| C       | 2016-01-01 | 2016-01-02 | 1          |
| C       | 2016-01-02 | 2016-01-03 | 1          |
| C       | 2016-01-03 | NULL       | NULL       |
+---------+------------+------------+------------+

Я хочу обновить последнюю запись каждого кластера продуктов и установить для Lead_date и delta_days значение null.Как мне это сделать?

Это моя цель:

+---------+------------+------------+------------+
| Product |    Date    |  LeadDate  | delta_days |
+---------+------------+------------+------------+
| A       | 2018-01-15 | 2018-01-23 | 8          |
| A       | 2018-01-23 | 2018-02-19 | 27         |
| A       | 2018-02-19 | NULL       | NULL       |
| B       | 2017-05-25 | 2017-05-30 | 5          |
| B       | 2017-05-30 | NULL       | NULL       |
| C       | 2016-01-01 | 2016-01-02 | 1          |
| C       | 2016-01-02 | 2016-01-03 | 1          |
| C       | 2016-01-03 | NULL       | NULL       |
+---------+------------+------------+------------+

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Вы можете использовать обновляемый cte с last_value() функцией:

with updatable as (
        select *, last_value(date) over (partition by product order by date) as last_val
        from table 
)

update updatable 
set LeadDate = null, delta_days = null
where Date = last_val;
0 голосов
/ 08 июня 2018

Lag / Lead имеют значение по умолчанию, если не может найти следующее / предыдущее значение:

LAG (scalar_expression [,offset] [,default])  
    OVER ( [ partition_by_clause ] order_by_clause )  

Просто укажите, что вы хотите, чтобы [default] было NULL вВаш код для создания вашего ведущего столбца

В вашем коде (угадайте, поскольку у нас его нет):

SELECT date, 
LEAD([date], 1, NULL) OVER(PARTITION BY Product ORDER BY [date]) as your_new_col

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...