Sql 在业务发生变化时进行标记

Sql 在业务发生变化时进行标记,sql,Sql,数据传输 我试图标记那些业务代码正在更改的事件。我试过下面提到的问题, 然而,我得到的结果也显示了以前的业务代码。我希望查询只标记更改的业务代码行 我试过这个问题 代码: 结果我想--> 您可以使用lag(): : ID | Business | STDT | (No column name) --: | -------: | -------: | ---------------: 501 | 50005038 | 20170208 | null 501 | 50

数据传输

我试图标记那些业务代码正在更改的事件。我试过下面提到的问题, 然而,我得到的结果也显示了以前的业务代码。我希望查询只标记更改的业务代码行

我试过这个问题

代码:

结果我想-->

您可以使用
lag()

ID | Business | STDT | (No column name) --: | -------: | -------: | ---------------: 501 | 50005038 | 20170208 | null 501 | 50005038 | 20170801 | null 501 | 50005035 | 20170802 | 1 501 | 50005038 | 20171101 | 1 501 | 50005038 | 20180101 | null 501 | 50005035 | 20180201 | 1 514 | 50005038 | 20170208 | null 514 | 50005038 | 20170423 | null 514 | 50005038 | 20170801 | null 514 | 50005038 | 20170801 | null 514 | 50005035 | 20170802 | 1 514 | 50005038 | 20171101 | 1 514 | 50005035 | 20171201 | 1 ID | Business | STDT |(无列名) --: | -------: | -------: | ---------------: 501 | 50005038 | 20170208 |空 501 | 50005038 | 20170801 |空 501 | 50005035 | 20170802 | 1 501 | 50005038 | 20171101 | 1 501 | 50005038 | 20180101 |空 501 | 50005035 | 20180201 | 1 514 | 50005038 | 20170208 |空 514 | 50005038 | 20170423 |空 514 | 50005038 | 20170801 |空 514 | 50005038 | 20170801 |空 514 | 50005035 | 20170802 | 1 514 | 50005038 | 20171101 | 1 514 | 50005035 | 20171201 | 1
GMB的回答很好,但可以简化为:

select t.*,
       (case when business = lag(business) over (partition by id order by stdt)
             then null else 1
        end) as flag
from mytable t;
ID            Business              Timestamp
501         50005038             20170801
501         50005035             20170802
501         50005035             20170802
501         50005038             20171101
501         50005038             20180101
501         50005035             20180201
514         50005038             20170801
514         50005035             20170802
514         50005035             20170802
514         50005038             20171101
514         50005038             20171101
ID                          Business              STDT                      Flag
501                         50005038             20170208             
501                         50005038             20170801
501                         50005035             20170802             1
501                         50005038             20171101             1
501                         50005038             20180101
501                         50005035             20180201             1
514                         50005038             20170208
514                         50005038             20170423
514                         50005038             20170801
514                         50005038             20170801
514                         50005035             20170802             1
514                         50005038             20171101             1
514                         50005035             20171201             1
select 
    t.*,
    case 
        when not (
            business = coalesce(lag(business) over(partition by id order by stdt), business)
        )
        then 1
    end
from mytable t
ID | Business | STDT | (No column name) --: | -------: | -------: | ---------------: 501 | 50005038 | 20170208 | null 501 | 50005038 | 20170801 | null 501 | 50005035 | 20170802 | 1 501 | 50005038 | 20171101 | 1 501 | 50005038 | 20180101 | null 501 | 50005035 | 20180201 | 1 514 | 50005038 | 20170208 | null 514 | 50005038 | 20170423 | null 514 | 50005038 | 20170801 | null 514 | 50005038 | 20170801 | null 514 | 50005035 | 20170802 | 1 514 | 50005038 | 20171101 | 1 514 | 50005035 | 20171201 | 1
select t.*,
       (case when business = lag(business) over (partition by id order by stdt)
             then null else 1
        end) as flag
from mytable t;