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;