基于先前值的更改的更新标志

时间:2019-12-19 12:31:50

标签: sql sql-server

我有下表。需要sql,如果INPUT值有变化,则将FLAG更新为1,否则为0。

INPUT   START_DATE  PERSON_ID  FLAG
42707   2017-01-01  227317      0
40000   2018-01-01  227317      1
42400   2019-01-01  227317      1
42400   2019-01-02  227317      0 

2 个答案:

答案 0 :(得分:1)

如果要在查询中使用,请使用row_number()

select t.*,
       (case when row_number() over (partition by person_id order by start_date) = 1
             then 0 else 1
        end) as flag
from t;

如果input_value在不同的行上可以相同,则使用first_value()

select t.*,
       (case when value <> first_value(input) over (partition by person_id order by start_date) = 1
             then 0 else 1
        end) as flag
from t;

如果您想更新表格,则可以使用可更新的CTE将任何一种表格合并到update中。

编辑:

如果您想知道该值是否从一行更改为“下一个”,请使用lag()。在update中,它看起来像:

with toupdate as (
      select t.*,
             lag(input) over (partition by customerid order by date) as prev_input
      from t
     )
update toupdate
    set flag = (case when prev_input <> input then 1 else 0 end);

也就是说,我不建议您将数据存储在表中。相反,只需在需要时将其放入select中即可。否则,如果更新历史值,则数据可能会过时。

答案 1 :(得分:1)

您可以使用123,1

lag()