我有下表。需要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
答案 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()