Как получить первое и последнее значение в столбце для каждой последовательности с одинаковым значением - PullRequest
0 голосов
/ 21 июня 2020

Я хотел бы получить первое и последнее значение в столбце 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

1 Ответ

1 голос
/ 21 июня 2020

Я бы предложил 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);

Эти сравнения определяют, где изменяется значение - что на самом деле то, о чем вы просите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...