更新每个群集的最后一条记录

时间:2018-06-08 19:07:22

标签: sql sql-server tsql

我有一张表,我已经为每个产品集群中的下一个日期创建了潜在客户价值。除此之外,我创建了一个delta值,显示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 :(得分:1)

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,这比运行实际更新更好,因为如果您插入将更改记录现有顺序的新记录,这将是动态的。

答案 1 :(得分:1)

您可以将可更新的ctelast_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;