SQL检测行的变化

标签 sql sql-server partition

我附加了来自 sql server 的数据:

select * from log

data

我想做的是检查列名称的代码是否有任何更改。因此,如果您从表日志中看到数据,代码将更改 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

然后得到这样的结果。

result

但是,我不想检索第一行。因为它是第一个值,所以我不需要它。所以我只想检索列代码指示的更改。如果您知道该怎么做,请提供帮助。

请注意,我无法使用过滤器 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/

相关文章:

mysql - SQL GROUP_CONCAT 与多个相关行的 LEFT JOIN

c# - 如何使用 SqlCommand 将多个 T-SQL 语句(由 GO 分隔)链接到对 SQL 的单个调用中

Cassandra - 不同表中的相同分区键 - 何时正确?

java - 持久化数亿个 SQL Timestamp 对象时性能会受到影响

mysql - 过去 7 天内至少登录一次的用户数量(逐日)

sql-server - T-Sql 函数将 varchar(在本例中是某人的名字)从大写转换为标题大小写?

arrays - 分区求和算法

indexing - Cassandra 表中的最佳索引模型

sql-server - 使用 T-SQL 生成 MD5 哈希字符串

sql-server - SSRS tablix 中的行高是如何计算的?