sql—如何为每个具有相同值的序列获取列中的第一个和最后一个值

xv8emn3q  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(261)

我想得到列中的第一个和最后一个值 Status1 相同值的每个序列!
这是我的表格的一个例子:

time                     Status1   Eficiencia   Lote
----------------------------------------------------
2020 06 14 18:03:48.457    70         80         95
2020 06 14 18:04:47.693    70         80         95
2020 06 14 18:06:58.203    55         80         95
2020 06 14 18:08:19.900    55         80         95
2020 06 14 18:09:45.537    55         80         95
2020 06 14 18:10:06.670   100         80         13
2020 06 14 18:10:27.297   100         80         13
2020 06 14 18:10:31.810   100         80         13
2020 06 14 18:10:43.187   100         80         13
2020 06 14 18:11:30.303    55         80         14
2020 06 14 18:12:07.563    55         80         14
2020 06 14 18:18:54.997    55         80         14

我试过这个,但用这个我没有通过每一个序列,但在洞表!

;with cte as
(
    select
        *,
        RnAsc = row_number() over (partition by [Status1] order by time),
        RnDesc = row_number() over (partition by [Status1] order by time desc) 
    from 
        [VALORES_DB].[dbo].[OEE_TESTE]
)
select time, [Status1], Eficiencia, Lote, Status1 
from cte
where RnAsc = 1 or RnDesc = 1

我想得到以下信息:

time                      Status1   Eficiencia   Lote
------------------------------------------------------
2020 06 14 18:03:48.457     70          80        95
2020 06 14 18:04:47.693     70          80        95
2020 06 14 18:06:58.203     55          80        95
2020 06 14 18:09:45.537     55          80        95
2020 06 14 18:10:06.670    100          80        13
2020 06 14 18:10:43.187    100          80        13
2020 06 14 18:11:30.303     55          80        14
2020 06 14 18:18:54.997     55          80        14
ne5o7dgx

ne5o7dgx1#

我建议 lag() 以及 lead() :

select t.*
from (select t.*,
             lag(status1) over (order by time) as prev_status1,
             lead(status1) over (order by time) as next_status1
      from t
     ) t
where (prev_status1 is null or prev_status1 <> status1) or
      (next_status1 is null or next_status1 <> status1);

这些比较决定了价值的变化——这才是你真正想要的。

相关问题