SQL Запрос посещаемости времени - PullRequest
0 голосов
/ 02 апреля 2020

Недавно я переключился с MS Access на SQL Сервер. Из-за этого переключателя у меня возникают проблемы с выполнением одного запроса SQL.

Так выглядит текущая таблица в SQL.

enter image description here

Вот что я пытаюсь получить в результате запроса:

enter image description here

Ранее я мог заставить его работать в MS Access по следующему запросу:

SELECT m.UserEnrollNumber, m.Checktime AS TimeIn, (SELECT Min(s.Checktime)
    FROM CheckInOut1 s
    WHERE s.UserEnrollNumber = m.UserEnrollNumber
    AND s.Checktime > m.Checktime
    AND s.Checktime <= Int(m.Checktime) + 1) AS TimeOut
FROM CheckInOut1 AS m
WHERE ((((SELECT COUNT(*) 
    FROM CheckInOut1 s 
    WHERE s.UserEnrollNumber = m.UserEnrollNumber
    AND s.Checktime <= m.Checktime
    AND s.Checktime >= INT(m.Checktime)) Mod 2)=1));

Следующий запрос в ответ от @GMB:

select
        employee_id,
        min(time_in_out) check_in,
        max(time_in_out) check_out
    from (
        select t.*, row_number() over(partition by employee_id order by time_in_out) - 1 rn
        from mytable t
    ) t
    group by employee_id, floor(rn / 2) 
    order by employee_id, floor(rn / 2)

от SQL таблица:

enter image description here

дает мне следующий результат:

enter image description here

Похоже, что показаны минимальная и максимальная строки, но между ними нет строк.

Следующий запрос от @Gordon Linoff:

SELECT cio.EmployeeID, cio.TimeInOut AS CheckIn, 
       cio.TimeInOut as CheckOut
FROM (SELECT cio.*,
             ROW_NUMBER() OVER (PARTITION BY cio.EmployeeID, CONVERT(date, cio.TimeInOut) ORDER BY cio.TimeInOut) as seqnum,
             LEAD(cio.TimeInOut) OVER (PARTITION BY cio.EmployeeID, CONVERT(date, cio.TimeInOut) ORDER BY cio.TimeInOut) as next_TimeInOut
      FROM CheckInOut22 cio
     ) cio
WHERE seqnum % 2 = 1;

Дает мне следующий результат:

enter image description here

Регистрация такая же, как CheckOut.

Мы будем благодарны за любую помощь.

1 Ответ

0 голосов
/ 02 апреля 2020

Это намного проще на SQL сервере. Используйте оконные функции:

SELECT cio.EmployeeID, cio.TimeInOut AS CheckIn, 
       cio.next_TimeInOut as CheckOut
FROM (SELECT cio.*,
             ROW_NUMBER() OVER (PARTITION BY cio.EmployeeID, CONVERT(date, cio.TimeInOut) ORDER BY cio.TimeInOut) as seqnum,
             LEAD(cio.TimeInOut) OVER (PARTITION BY cio.EmployeeID, CONVERT(date, cio.TimeInOut) ORDER BY cio.TimeInOut) as next_TimeInOut
      FROM CheckInOut cio
     ) cio
WHERE seqnum % 2 = 1;
...