Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 基于先前值的更改更新标志_Sql_Sql Server - Fatal编程技术网

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

Sql 基于先前值的更改更新标志,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 如果要在查询中使用此选项,请使用行号(): 如果不同行上的输入值可能相同,则使用第一

我有下表。需要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 

如果要在查询中使用此选项,请使用
行号()

如果不同行上的
输入值可能相同,则使用
第一个\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;