Sql 基于先前值的更改更新标志
我有下表。需要sql,如果输入值有变化,则将标志更新为1,否则为0Sql 基于先前值的更改更新标志,sql,sql-server,Sql,Sql Server,我有下表。需要sql,如果输入值有变化,则将标志更新为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 如果要在查询中使用此选项,请使用行号(): 如果不同行上的输入值可能相同,则使用第一
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
如果要在查询中使用此选项,请使用
行号()
:
如果不同行上的输入值可能相同,则使用第一个\u值()
:
也就是说,我不建议您将数据存储在表中。相反,只要在需要时将逻辑放入选择中即可。否则,如果更新了历史值,数据可能会过期。如果要在查询中使用此值,请使用行号()
如果不同行上的输入值可能相同,则使用第一个\u值()
:
也就是说,我不建议您将数据存储在表中。相反,只要在需要时将逻辑放入选择中即可。否则,如果更新历史值,数据可能会过期。您可以使用lag()
:
您可以使用lag()
:
在您的数据中,input
对于个人是唯一的,因此您只标记该行是否为第一行。现在u-check可以检查2019-01-01到2019-01-02之间的输入没有变化,因此其标记在您的数据中应为0,input
对于个人是唯一的,因此,您仅标记该行是否为第一行。现在u check可以检查2019-01-01到2019-01-02之间的输入是否没有变化,因此其标志应该是0您可以检查2019-01-01到2019-01-02之间的输入是否没有变化,因此其标志应该是0任何不使用滞后函数的方法?@at9063。所有受支持的SQL Server版本都支持lag()
,因此我不理解您的评论。您可以检查2019-01-01到2019-01-02期间的输入没有变化,因此其标志应为0任何不使用lag函数的方法?@at9063。所有受支持的SQL Server版本都支持lag()
,因此我不理解您的评论。
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;
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;
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 t.*,
(case when lag(input, 1, input) over (partition by person_id order by start_date) = input
then 0 else 1
end) as FLAG
from table t;