хотите удалить время перфорации, когда время доступа карты Continuous IN перфорировано в SQL Server 2008 - PullRequest
1 голос
/ 21 октября 2019
2019-10-03 15:01:41.000 DOOR1   IN
2019-10-03 19:41:37.000 DOOR2   OUT
2019-10-04 09:38:13.000 DOOR1   IN
2019-10-04 14:34:52.000 DOOR1   OUT
2019-10-04 15:04:49.000 DOOR1   IN
2019-10-05 11:50:55.000 DOOR2   IN
2019-10-05 13:32:01.000 DOOR2   OUT
2019-10-05 14:05:57.000 DOOR1   IN
2019-10-05 20:41:03.000 DOOR1   OUT

Я хочу удалить один / несколько перфораторов IN или OUT, когда они приходят непрерывно, хочу сохранить только последний перфоратор. Это означает, что два IN перфорированные, первый удар хотят удалить следующим образом:

2019-10-04 15:04:49.000 DOOR1 IN - Want to remove this one
2019-10-05 11:50:55.000 DOOR2 IN

1 Ответ

1 голос
/ 21 октября 2019

Используйте lag():

select t.*
from (select t.*,
             lag(col3) over (order by col1) as prev_col3
      from t
     ) t
where not (prev_col3 = 'IN' and col3 = 'IN') or
      prev_col3 is null

Если вы действительно хотите удалить записей (что я не рекомендую), вы можете включить эту логику в delete:

with todelete as (
      select t.*,
             lag(col3) over (order by col1) as prev_col3
      from t
     )
delete from todelete
    where prev_col3 = 'IN' and col3 = 'IN';

РЕДАКТИРОВАТЬ:

В старых, неподдерживаемых версиях SQL Server вы можете использовать коррелированный подзапрос:

select t.*
from (select t.*,
             (select top (1) t2.col3
              from t t2
              where t2.col1 < t.col1 
              order by t2.col1 desc
             ) as prev_col3
      from t
     ) t
where not (prev_col3 = 'IN' and col3 = 'IN') or
      prev_col3 is null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...