MYSQL - Фильтр последовательных ненулевых дат - PullRequest
0 голосов
/ 03 сентября 2018

Получить только самую большую дату: Get only the biggest date

Это записи о приеме и выезде сотрудников, иногда они делают два или более записей в системе подряд. В этом примере было два выезда подряд. Предполагая, что эти строки всегда будут упорядочены, в случае отъезда я хотел бы иметь самую большую дату, а в случае регистрации - наименьшую дату.

В таком случае я хотел бы иметь это:

Меньшая дата была исключена: The smaller date was excluded

DEMO

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Попробуйте, в этом большом операторе CASE я увеличиваю столбец на единицу, если checkin переключается с null на not null и наоборот. Тогда достаточно сгруппировать по этому столбцу, взяв max и min из checkout и checkin соответственно:

select @checkinLag := null, @rn := 0;
select max(id), 
       functionario,
       loja, 
       min(checkin),
       max(checkout) 
from (
    select case when (checkinLag is null and checkin is not null) or
                     (checkinLag is not null and checkin is null)
                then @rn := @rn + 1 else @rn end rn,
           checkin,
           checkout,
           loja,
           id,
           functionario           
    from (
        select @checkinLag checkinLag,
               @checkinLag := checkin,
               checkin,
               checkout,
               loja,
               id,
               functionario
        from dummyTable
        order by coalesce(checkin, checkout)
    ) a
) a group by functionario, loja, rn

Я использовал подзапросы, чтобы гарантировать порядок вычисления выражений (присваивание и использование @checkinLag), как указал Гордон Линофф.

Демо

0 голосов
/ 03 сентября 2018

Мое решение:

Select
  *
from dummyTable base
where (base.checkout is null or not exists (
  select
    1
  from dummyTable co
  where co.checkout between base.checkout and DATE_ADD(base.checkout, INTERVAL 5 SECOND)
  and base.id <> co.id
  and base.functionario = co.functionario
  and base.loja = co.loja
)) and (base.checkin is null or not exists (
  select
    1
  from dummyTable ci
  where ci.checkin between DATE_SUB(base.checkin, INTERVAL 5 SECOND) and base.checkin
  and base.id <> ci.id
  and base.functionario = ci.functionario
  and base.loja = ci.loja
));

Вы можете проверить запрос здесь . Нет необходимости в том, чтобы строки были упорядочены. Я выбираю 5 секунд в качестве интервала, в котором регистрация / выходы должны игнорироваться.

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