我附加了来自 sql server 的数据:
select * from log
我想做的是检查列名称的代码是否有任何更改。因此,如果您从表日志中看到数据,代码将更改 2 次(B02、B03)。
我想做的是每次代码更改时检索第一个更改的行。在此示例中,第一个更改位于红色框内。所以我想要第 5 行和第 9 行的结果。
我试过像下面的代码那样使用分区:
select a.name,a.code from(
select name,code,row_number() over(partition by code order by name) as rank from log)a
where a.rank=1
然后得到这样的结果。
但是,我不想检索第一行。因为它是第一个值,所以我不需要它。所以我只想检索列代码指示的更改。如果您知道该怎么做,请提供帮助。
请注意,我无法使用过滤器 where code <> 'B01'
编写查询,因为在这种情况下,我不知道第一个值是什么。
请假设第一个值是第一个插入到表中的数据。
最佳答案
使用 lag
获取前一行的值(假设 id
指定顺序)并获取与当前行值不同的行。
create table #log (id int identity(1,1) not null, name nvarchar(100), code nvarchar(100));
insert into #log(name,code) values ('SARUMA','B01'), ('SARUMA','B01'), ('SARUMA','B01'), ('SARUMA','B01');
insert into #log(name,code) values ('SARUMA','B02'), ('SARUMA','B02'), ('SARUMA','B02'), ('SARUMA','B02');
insert into #log(name,code) values ('SARUMA','B03'), ('SARUMA','B03');
select name
,code
from (
select l.*
,lag(code) over (
partition by name order by id
) as prev_code
from #log l
) l
where prev_code <> code
关于SQL检测行的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46117466/