Создание представления посещаемости из одного столбца расписания (SQL Server 2008 R2) - PullRequest
1 голос
/ 20 марта 2019

У меня есть данные о посещаемости с SQL Server, которые я должен разделить на 2 столбца (вход и выход).

Вот пример:

Данные

И вот результат, который я хочу

enter image description here

Запрос:

CREATE TABLE [dbo].[Table1]
(
    [ID] [varchar](50) NULL,
    [DATETIME] [datetime] NULL,
    [Flag] [int] NULL
)

INSERT INTO table1 
VALUES ('ID-1', '2019-03-13 09:48:00.000', '2'),
       ('ID-1', '2019-03-13 09:48:00.000', '2'),
       ('ID-1', '2019-03-13 18:11:00.000', '3'),
       ('ID-1', '2019-03-13 18:11:00.000', '3'),
       ('ID-1', '2019-03-14 02:00:00.000', '3'),
       ('ID-1', '2019-03-14 09:54:00.000', '2'),
       ('ID-1', '2019-03-14 09:54:00.000', '2'),
       ('ID-1', '2019-03-14 09:54:00.000', '2'),
       ('ID-1', '2019-03-14 22:00:00.000', '3'),
       ('ID-1', '2019-03-14 22:00:00.000', '3'),
       ('ID-1', '2019-03-14 22:00:00.000', '3'),
       ('ID-1', '2019-03-15 13:55:00.000', '2'),
       ('ID-1', '2019-03-15 13:55:00.000', '2'),
       ('ID-1', '2019-03-15 13:55:00.000', '2'),
       ('ID-1', '2019-03-15 13:55:00.000', '2'),
       ('ID-1', '2019-03-15 13:55:00.000', '2'),
       ('ID-1', '2019-03-15 22:00:00.000', '3'),
       ('ID-1', '2019-03-15 22:00:00.000', '3'),
       ('ID-1', '2019-03-15 22:00:00.000', '3'),
       ('ID-1', '2019-03-15 22:00:00.000', '3')

Примечание:

  1. Флаг 2 означает IN, а 3 означает OUT.

  2. Возможна более чем одна регистрация заезда и отъезда, поэтому мы должны пройти первую и последнюю регистрацию.

  3. Могут быть сверхурочные, поэтому иногда мы должны проверить данные о выезде со следующего дня.

Как я могу это сделать?

1 Ответ

0 голосов
/ 20 марта 2019

возможно, попробуйте левое соединение от входов до выходов и найдите самое раннее время после этого времени.

образец ниже (не проверено):

WITH ins
AS ( SELECT *
     FROM   table1
     WHERE  Flag = 2 )
    ,outs
AS ( SELECT *
     FROM   table1
     WHERE  Flag = 3 )
SELECT   i.ID
        ,i.DATETIME InTime
        ,MIN(o.DATETIME) OutTime
FROM     ins i
         LEFT JOIN outs o ON o.ID = i.ID AND o.DATETIME > i.DATETIME -- out must be later than in
GROUP BY i.ID
        ,i.DATETIME
        ,i.Flag;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...