Запрос на получение расписания из нескольких ударов - PullRequest
0 голосов
/ 09 июля 2020

У меня проблемы с построением запроса, в котором для каждого сотрудника есть только одно расписание на каждый день. Данные, которыми я управляю, записывают каждый удар по времени и время каждого удара. Запрос, который я использовал, работал нормально, пока я не столкнулся с расписанием, которое длилось всю ночь. Ниже приведен запрос, который я использовал, и некоторые образцы данных.

SELECT EMPLOYEEID
,min(PUNCHIN) AS PUNCHIN
,max(PUNCHOUT) AS PUNCHOUT
FROM EMPSCHED
WHERE PUNCHIN <> PUNCHOUT 
GROUP BY EMPLOYEEID
,CAST(PUNCHIN AS DATE)
order by EMPID, PUNCHIN

Образец таблицы:

EMPLOYEEID  PUNCHIN             PUNCHOUT
DGHAG   2020-07-10 20:00:00.000 2020-07-11 01:45:00.000
DGHAG   2020-07-11 01:45:00.000 2020-07-11 02:15:00.000
DGHAG   2020-07-11 02:15:00.000 2020-07-11 06:30:00.000
DGHAG   2020-07-11 06:30:00.000 2020-07-11 06:30:00.000
DGHAG   2020-07-11 20:00:00.000 2020-07-11 23:30:00.000
DGHAG   2020-07-11 23:30:00.000 2020-07-12 00:00:00.000
DGHAG   2020-07-12 00:00:00.000 2020-07-12 06:30:00.000
DGHAG   2020-07-12 06:30:00.000 2020-07-12 06:30:00.000
DGHAG   2020-07-12 20:00:00.000 2020-07-13 02:15:00.000
DGHAG   2020-07-13 02:15:00.000 2020-07-13 02:45:00.000
DGHAG   2020-07-13 02:45:00.000 2020-07-13 06:30:00.000
DGHAG   2020-07-13 06:30:00.000 2020-07-13 06:30:00.000
DGHFA   2020-07-08 08:30:00.000 2020-07-08 13:30:00.000
DGHFA   2020-07-08 13:30:00.000 2020-07-08 13:30:00.000
DGHFA   2020-07-09 08:30:00.000 2020-07-09 13:30:00.000
DGHFA   2020-07-09 13:30:00.000 2020-07-09 13:30:00.000
DGHFA   2020-07-11 08:30:00.000 2020-07-11 13:30:00.000
DGHFA   2020-07-11 13:30:00.000 2020-07-11 13:30:00.000

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

Код создания таблицы:

CREATE TABLE [dbo].[EMPSCHED](
    [EMPLOYEEID] [nvarchar](50) NULL,
    [PUNCHIN] [datetime] NULL,
    [PUNCHOUT] [datetime] NULL
)

1 Ответ

0 голосов
/ 10 июля 2020

Следующий запрос обнаружит все пробелы в расписании (перерывы или конец смены) независимо от продолжительности смены (она может охватывать несколько дней).

WITH CTE AS (
  SELECT 
    EMPLOYEEID
    ,LAG(PUNCHOUT) OVER (PARTITION BY EMPLOYEEID ORDER BY PUNCHIN ASC) as last_punchout
    ,PUNCHIN
    ,PUNCHOUT
    ,LEAD(PUNCHIN) OVER (PARTITION BY EMPLOYEEID ORDER BY PUNCHIN ASC) as next_punchin
  FROM EMPSCHED
  WHERE PUNCHIN <> PUNCHOUT 
)
SELECT 
  EMPLOYEEID
  ,PUNCHIN
  ,PUNCHOUT
FROM CTE 
WHERE last_punchout <> PUNCHIN 
OR PUNCHOUT <> next_punchin 
OR last_punchout is null 
OR next_punchin is null

Вы можете поэкспериментировать с этим здесь: https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=b651d6614d14ccec2f8da4d63f5f6a2f

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