如何只检索统计变化的记录?

How to retrieve only the records where stat changes?

我想要得到相同的输出:

使用以下示例数据

create table x
(
     id int, 
     date datetime, 
     stat int
)

insert into x 
values (1, '2017-01-01', 100), (1, '2017-01-03', 100), (1, '2017-01-05', 100),
       (1, '2017-01-07', 150), (1, '2017-01-09', 150), (1, '2017-02-01', 150),
       (1, '2017-02-02', 100), (1, '2017-02-12', 100), (1, '2017-02-15', 100),
       (1, '2017-02-17', 150), (1, '2017-03-09', 150), (1, '2017-03-11', 150),
       (2, '2017-01-01', 100), (2, '2017-01-03', 100), (2, '2017-01-05', 100),
       (2, '2017-01-07', 150), (2, '2017-01-09', 150), (2, '2017-02-01', 150),
       (2, '2017-02-02', 100), (2, '2017-02-12', 100), (2, '2017-02-15', 100),
       (2, '2017-02-17', 150), (2, '2017-03-09', 150), (2, '2017-03-11', 150)

我试过用这样的东西

with a as
(
    select 
        id, date,
        ROW_NUMBER() over (partition by date order by id) as rowNum  
    from 
        x
), b as 
(
     select 
         id, date,
         ROW_NUMBER() over (partition by id, stat order by date) as rowNum   
     from 
         x
)
select min(b.date)  
from a
join b on b.id = a.id
having max(a.date) > max(b.date)

您正在寻找的是 场景,其中只有岛屿。在这种情况下,定义岛起点的是 idstat 值的变化,同时按 date 顺序评估数据集。

下面使用 lag window 函数来比较各行的值,并查看是否需要将其包含在输出中。

select b.id
, b.stat
, b.date
from (
    select a.id
    , a.date
    , a.stat
    , case lag(a.stat,1,NULL) over (partition by a.id order by a.date asc) when a.stat then 0 else 1 end as include_flag
    from x as a
    ) as b
where b.include_flag = 1