Bip baaap Ответов: 1

Как мне получить ночную/дневную смену первой и последней с несколькими записями?


Как мне получить записи о моей ночной и дневной смене с несколькими записями посещаемости?

Verify_State identify when 0 = Time in and 1 = Time out


То, что я пробовал запросы, находится здесь, в этом. Скрипка[^]

Там, где проблема заключается в том, что user_id 14-это дневная смена, а user_id 15-ночная смена, что я не могу правильно получить посещаемость.

Ожидаемый Выход :
user_id  verify_date      verify_state  prev_state  next_state    next_date
14    2019-11-05 07:23:00       0           1           1   2019-11-05 20:00:00
14    2019-11-06 07:23:00       0           1           0   2019-11-07 20:09:00
14    2019-11-08 07:18:00       0           1           1   2019-11-08 17:38:00
14    2019-11-11 07:20:00       0           1           1   2019-11-11 20:05:00
15    2019-11-12 19:57:00       0           1           0   2019-11-13 07:20:00


Что я уже пробовал:

Это тот самый запрос, который я уже пробовал :
with 
cte1 as ( select *, 
                 coalesce(lag(verify_state) over (partition by user_id order by verify_date asc),1) prev_state,
                 coalesce(lead(verify_state) over (partition by user_id order by verify_date asc),0) next_state
          from tbl_excel_attendance
),
cte2 as ( select *, 
                 lead(verify_date) over (partition by user_id order by verify_date asc) next_date
          from cte1 
          where (prev_state,verify_state,next_state) in ( (1,0,0),(1,0,1), (0,1,0) )
)
select * 
from cte2 
where verify_state = 0
  and next_date is not null
order by 2,3


но если записей было так много, то она не получит правильную запись, если это будет так. как и ожидаемый результат.

1 Ответов

Рейтинг:
0

CHill60

Сдвиг - это не то, что мешает вам получить правильный запрос, это базовые данные.
Например посмотрите на первые 6 записей сотрудника 14 в хронологическом порядке:

user_id	verify_date	verify_state
14	2019-11-05 07:23:00.000	0
14	2019-11-05 20:00:00.000	1
14	2019-11-06 07:23:00.000	0
14	2019-11-06 19:32:00.000	0
14	2019-11-07 07:25:00.000	0
14	2019-11-07 07:25:00.000	0
Сотрудник 14 не отсчитывал время между 2019-11-06 07:23:00.000 и 2019-11-06 19:32:00.000. то есть паттерн входит,выходит,входит,входит,входит.

Вам придется принять некоторые решения о том, что делать, когда данные синхронизации недоступны.

Например, предположим максимальную длину сдвига и выведем последовательность IN,OUT,IN,OUT, вставляя пропущенные записи с предполагаемыми значениями.

Чтобы использовать этот метод, создайте последовательность (используйте CTE или временную таблицу) ожидаемых дат начала и окончания сдвига, охватывающую весь диапазон интересующих вас дат и времен. Манас приводит несколько примеров в этом совете - Генерация последовательности в SQL[^]
Затем используйте эту последовательность с левым внешним соединением с данными, которые у вас есть, или вставьте недостающие данные в базовую таблицу