В SSMS, используя таблицу календаря (с разбивкой на четверть часа), как я могу суммировать по определенным столбцам за перекрывающиеся интервалы времени? - PullRequest
0 голосов
/ 15 ноября 2018

Пожалуйста, смотрите это сообщение вчера о моей первоначальной проблеме.

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

Я написал запрос, в котором для каждого "другого сотрудника" был задан интервал времени перекрытия с краеугольным камнем. Для одной смены временная шкала выглядит так:

 Key Emp. | 9AM------------------------6PM
 Emp. A   | 9AM------------------------6PM
 Emp. B   |         12PM-------4PM        

Таким образом, дискретные периоды, когда можно провести истинное «контролируемое» сравнение, относятся к:

  • Ключ, A и B с 12:00 до 16:00 * 013 *
  • Ключ и A с 9:00 до 12:00 * 015 *
  • Ключ и A от 4 вечера - 6 вечера * 017 *

Конечная цель - собрать все действия (организованные как события с отметками даты и времени в отдельной таблице) для каждого сотрудника, которые происходят в эти периоды времени, и сравнить итоги для каждого соответствующего сотрудника. Таким образом, для каждого временного интервала будут действовать отдельные итоговые значения «Количество (событий)», затронутые только теми сотрудниками, которые делят интервал времени, как описано выше.

Столбцы «In» и «Out» для ключевых и других сотрудников хранятся как DATETIME.

В настоящее время мои данные организованы так:

Key_ShiftID | Key In | Key Out | K 2017-01-01 09:00:00.000 2017-01-10 18:00:00.000 K 2017-01-01 09:00:00.000 2017-01-10 18:00:00.000

... продолжение ...

Oth_Emp_ShiftID | Oth_Emp_In | Oth_Emp_Out A 2017-01-01 09:00:00.000 2017-01-01 18:00:00.000 B 2017-01-01 12:00:00.000 2017-01-01 16:00:00.000

Где идентификаторы сдвига (Key_ShiftID и Oth_Emp_ShiftID) являются уникальными строками, а временные интервалы определяются двумя столбцами, причем фрагмент (Key_In & Key_Out + Oth_Emp_In & Oth_Emp_Out) хранится в качестве даты / времени. Я ищу отдельные периоды, когда я могу сравнить активность сотрудников, которая представлена ​​в отдельной таблице, где каждое событие имеет уникальную дату и время, как было упомянуто ранее. Таким образом, я думаю, что конечные данные будут выглядеть примерно так:

Key_ShiftID | Key In | Key Out | K 2017-01-01 09:00:00.000 2017-01-01 18:00:00.000 K 2017-01-01 09:00:00.000 2017-01-01 18:00:00.000 K 2017-01-01 09:00:00.000 2017-01-01 18:00:00.000 K 2017-01-01 09:00:00.000 2017-01-01 18:00:00.000

... продолжение ...

Oth_Emp_ShiftID | Oth_Emp_In | Oth_Emp_Out A 2017-01-01 12:00:00.000 2017-01-01 16:00:00.000 B 2017-01-01 12:00:00.000 2017-01-01 16:00:00.000 A 2017-01-01 09:00:00.000 2017-01-01 12:00:00.000 A 2017-01-01 16:00:00.000 2017-01-01 18:00:00.000

Вот пример кода из этой таблицы:

CREATE TABLE "sample_data" ( "Employee" INT, "Key_ShiftID" TEXT, "Key_In" TIMESTAMP, "Key_Out" TIMESTAMP, "Other_Emp_ShiftID" TEXT, "Other_Emp_In" TIMESTAMP, "Other_Emp_Out" TIMESTAMP, "overlap_min" TIMESTAMP, "overlap_max" TIMESTAMP ); INSERT INTO "sample_data" VALUES (900, '545BD826-0C9A-408B-BE9F-4C3D7D307948', '2016-09-27 14:15:00', '2016-09-27 21:45:00', '035FA1C1-B469-44EB-B5B4-5B6948574464', '2016-09-27 08:45:00', '2016-09-27 16:15:00', '2016-09-27 14:15:00', '2016-09-27 16:15:00'), (78, '545BD826-0C9A-408B-BE9F-4C3D7D307948', '2016-09-27 14:15:00', '2016-09-27 21:45:00', '74035838-FD07-4F8D-8AC4-F6407AC786D9', '2016-09-27 18:00:00', '2016-09-27 21:15:00', '2016-09-27 18:00:00', '2016-09-27 21:15:00'), (900, '545BD826-0C9A-408B-BE9F-4C3D7D307948', '2016-09-27 14:15:00', '2016-09-27 21:45:00', 'D7E9ADCD-8631-476D-B69F-00626F0E4B06', '2016-09-27 16:45:00', '2016-09-27 21:45:00', '2016-09-27 16:45:00', '2016-09-27 21:45:00');

Прошлой ночью я построил календарь. Каждый сотрудник представлен четырьмя новыми переменными, отражающими каждый 15-минутный интервал, включая ключевого сотрудника:

  1. флаг о том, работал ли сотрудник в течение 15 минут
  2. количество событий, связанных с этим сотрудником за этот период времени
  3. DATETIME начала смены, связанной с этим интервалом
  4. DATETIME конца смены, связанной с этим интервалом

Вот примерные данные той же информации о смене, но представленные в таблице календаря:

`CREATE TABLE sample_data (
[month] INT,
[day] INT,
[year] INT,
[hourno] INT,
[quarter] INT,
[start] DATETIME,
[end] DATETIME,
[KEY_SHIFTID] NVARCHAR(36),
[Column_Key] INT,
[Column_Key_start] DATETIME,
[Column_Key_end] DATETIME,
[Column_Key_num_pat] NVARCHAR(4),
[Column_900] NVARCHAR(4),
[Column_900_start] NVARCHAR(19),
[Column_900_end] NVARCHAR(19),
[Column_900_num_pat] NVARCHAR(4),
[Column_78] NVARCHAR(4),
[Column_78_start] NVARCHAR(19),
[Column_78_end] NVARCHAR(19),
[Column_78_num_pat] NVARCHAR(4)

); `

`INSERT INTO sample_data VALUES
(9,27,2016,15,2,'2016-09-27 14:15:00','2016-09-27 14:29:59',N'545BD826-0C9A-408B-BE9F-4C3D7D307948',1,'2016-09-27 14:15:00','2016-09-27 21:45:00',N'NULL',N'1',N'2016-09-27 14:15:00',N'2016-09-27 16:15:00',N'1',N'NULL',N'NULL',N'NULL',N'NULL'),
(9,27,2016,15,3,'2016-09-27 14:30:00','2016-09-27 14:44:59',N'545BD826-0C9A-408B-BE9F-4C3D7D307948',1,'2016-09-27 14:15:00','2016-09-27 21:45:00',N'1',N'1',N'2016-09-27 14:15:00',N'2016-09-27 16:15:00',N'NULL',N'NULL',N'NULL',N'NULL',N'NULL'),
(9,27,2016,15,4,'2016-09-27 14:45:00','2016-09-27 14:59:59',N'545BD826-0C9A-408B-BE9F-4C3D7D307948',1,'2016-09-27 14:15:00','2016-09-27 21:45:00',N'NULL',N'1',N'2016-09-27 14:15:00',N'2016-09-27 16:15:00',N'NULL',N'NULL',N'NULL',N'NULL',N'NULL'),
(9,27,2016,16,1,'2016-09-27 15:00:00','2016-09-27 15:14:59',N'545BD826-0C9A-408B-BE9F-4C3D7D307948',1,'2016-09-27 14:15:00','2016-09-27 21:45:00',N'NULL',N'1',N'2016-09-27 14:15:00',N'2016-09-27 16:15:00',N'NULL',N'NULL',N'NULL',N'NULL',N'NULL'),
(9,27,2016,16,2,'2016-09-27 15:15:00','2016-09-27 15:29:59',N'545BD826-0C9A-408B-BE9F-4C3D7D307948',1,'2016-09-27 14:15:00','2016-09-27 21:45:00',N'1',N'1',N'2016-09-27 14:15:00',N'2016-09-27 16:15:00',N'1',N'NULL',N'NULL',N'NULL',N'NULL'),
(9,27,2016,16,3,'2016-09-27 15:30:00','2016-09-27 15:44:59',N'545BD826-0C9A-408B-BE9F-4C3D7D307948',1,'2016-09-27 14:15:00','2016-09-27 21:45:00',N'1',N'1',N'2016-09-27 14:15:00',N'2016-09-27 16:15:00',N'1',N'NULL',N'NULL',N'NULL',N'NULL'),
(9,27,2016,16,4,'2016-09-27 15:45:00','2016-09-27 15:59:59',N'545BD826-0C9A-408B-BE9F-4C3D7D307948',1,'2016-09-27 14:15:00','2016-09-27 21:45:00',N'2',N'1',N'2016-09-27 14:15:00',N'2016-09-27 16:15:00',N'NULL',N'NULL',N'NULL',N'NULL',N'NULL'),
(9,27,2016,17,1,'2016-09-27 16:00:00','2016-09-27 16:14:59',N'545BD826-0C9A-408B-BE9F-4C3D7D307948',1,'2016-09-27 14:15:00','2016-09-27 21:45:00',N'1',N'1',N'2016-09-27 14:15:00',N'2016-09-27 16:15:00',N'NULL',N'NULL',N'NULL',N'NULL',N'NULL'),
(9,27,2016,17,2,'2016-09-27 16:15:00','2016-09-27 16:29:59',N'545BD826-0C9A-408B-BE9F-4C3D7D307948',1,'2016-09-27 14:15:00','2016-09-27 21:45:00',N'NULL',N'NULL',N'NULL',N'NULL',N'1',N'NULL',N'NULL',N'NULL',N'NULL'),
(9,27,2016,17,3,'2016-09-27 16:30:00','2016-09-27 16:44:59',N'545BD826-0C9A-408B-BE9F-4C3D7D307948',1,'2016-09-27 14:15:00','2016-09-27 21:45:00',N'1',N'NULL',N'NULL',N'NULL',N'2',N'NULL',N'NULL',N'NULL',N'NULL'),
(9,27,2016,17,4,'2016-09-27 16:45:00','2016-09-27 16:59:59',N'545BD826-0C9A-408B-BE9F-4C3D7D307948',1,'2016-09-27 14:15:00','2016-09-27 21:45:00',N'1',N'1',N'2016-09-27 16:45:00',N'2016-09-27 21:45:00',N'1',N'NULL',N'NULL',N'NULL',N'NULL'),
(9,27,2016,18,1,'2016-09-27 17:00:00','2016-09-27 17:14:59',N'545BD826-0C9A-408B-BE9F-4C3D7D307948',1,'2016-09-27 14:15:00','2016-09-27 21:45:00',N'1',N'1',N'2016-09-27 16:45:00',N'2016-09-27 21:45:00',N'1',N'NULL',N'NULL',N'NULL',N'NULL'),
(9,27,2016,18,2,'2016-09-27 17:15:00','2016-09-27 17:29:59',N'545BD826-0C9A-408B-BE9F-4C3D7D307948',1,'2016-09-27 14:15:00','2016-09-27 21:45:00',N'NULL',N'1',N'2016-09-27 16:45:00',N'2016-09-27 21:45:00',N'1',N'NULL',N'NULL',N'NULL',N'NULL'),
(9,27,2016,18,3,'2016-09-27 17:30:00','2016-09-27 17:44:59',N'545BD826-0C9A-408B-BE9F-4C3D7D307948',1,'2016-09-27 14:15:00','2016-09-27 21:45:00',N'NULL',N'1',N'2016-09-27 16:45:00',N'2016-09-27 21:45:00',N'1',N'NULL',N'NULL',N'NULL',N'NULL'),
(9,27,2016,18,4,'2016-09-27 17:45:00','2016-09-27 17:59:59',N'545BD826-0C9A-408B-BE9F-4C3D7D307948',1,'2016-09-27 14:15:00','2016-09-27 21:45:00',N'NULL',N'1',N'2016-09-27 16:45:00',N'2016-09-27 21:45:00',N'1',N'NULL',N'NULL',N'NULL',N'NULL'),
(9,27,2016,19,1,'2016-09-27 18:00:00','2016-09-27 18:14:59',N'545BD826-0C9A-408B-BE9F-4C3D7D307948',1,'2016-09-27 14:15:00','2016-09-27 21:45:00',N'NULL',N'1',N'2016-09-27 16:45:00',N'2016-09-27 21:45:00',N'2',N'1',N'2016-09-27 18:00:00',N'2016-09-27 21:15:00',N'1'),
(9,27,2016,19,2,'2016-09-27 18:15:00','2016-09-27 18:29:59',N'545BD826-0C9A-408B-BE9F-4C3D7D307948',1,'2016-09-27 14:15:00','2016-09-27 21:45:00',N'NULL',N'1',N'2016-09-27 16:45:00',N'2016-09-27 21:45:00',N'NULL',N'1',N'2016-09-27 18:00:00',N'2016-09-27 21:15:00',N'3'),
(9,27,2016,19,3,'2016-09-27 18:30:00','2016-09-27 18:44:59',N'545BD826-0C9A-408B-BE9F-4C3D7D307948',1,'2016-09-27 14:15:00','2016-09-27 21:45:00',N'NULL',N'1',N'2016-09-27 16:45:00',N'2016-09-27 21:45:00',N'NULL',N'1',N'2016-09-27 18:00:00',N'2016-09-27 21:15:00',N'NULL'),
(9,27,2016,19,4,'2016-09-27 18:45:00','2016-09-27 18:59:59',N'545BD826-0C9A-408B-BE9F-4C3D7D307948',1,'2016-09-27 14:15:00','2016-09-27 21:45:00',N'NULL',N'1',N'2016-09-27 16:45:00',N'2016-09-27 21:45:00',N'1',N'1',N'2016-09-27 18:00:00',N'2016-09-27 21:15:00',N'1'),
(9,27,2016,20,1,'2016-09-27 19:00:00','2016-09-27 19:14:59',N'545BD826-0C9A-408B-BE9F-4C3D7D307948',1,'2016-09-27 14:15:00','2016-09-27 21:45:00',N'NULL',N'1',N'2016-09-27 16:45:00',N'2016-09-27 21:45:00',N'NULL',N'1',N'2016-09-27 18:00:00',N'2016-09-27 21:15:00',N'NULL'),
(9,27,2016,20,2,'2016-09-27 19:15:00','2016-09-27 19:29:59',N'545BD826-0C9A-408B-BE9F-4C3D7D307948',1,'2016-09-27 14:15:00','2016-09-27 21:45:00',N'NULL',N'1',N'2016-09-27 16:45:00',N'2016-09-27 21:45:00',N'1',N'1',N'2016-09-27 18:00:00',N'2016-09-27 21:15:00',N'1'),
(9,27,2016,20,3,'2016-09-27 19:30:00','2016-09-27 19:44:59',N'545BD826-0C9A-408B-BE9F-4C3D7D307948',1,'2016-09-27 14:15:00','2016-09-27 21:45:00',N'1',N'1',N'2016-09-27 16:45:00',N'2016-09-27 21:45:00',N'NULL',N'1',N'2016-09-27 18:00:00',N'2016-09-27 21:15:00',N'1'),
(9,27,2016,20,4,'2016-09-27 19:45:00','2016-09-27 19:59:59',N'545BD826-0C9A-408B-BE9F-4C3D7D307948',1,'2016-09-27 14:15:00','2016-09-27 21:45:00',N'1',N'1',N'2016-09-27 16:45:00',N'2016-09-27 21:45:00',N'NULL',N'1',N'2016-09-27 18:00:00',N'2016-09-27 21:15:00',N'1'),
(9,27,2016,21,1,'2016-09-27 20:00:00','2016-09-27 20:14:59',N'545BD826-0C9A-408B-BE9F-4C3D7D307948',1,'2016-09-27 14:15:00','2016-09-27 21:45:00',N'1',N'1',N'2016-09-27 16:45:00',N'2016-09-27 21:45:00',N'1',N'1',N'2016-09-27 18:00:00',N'2016-09-27 21:15:00',N'NULL'),
(9,27,2016,21,2,'2016-09-27 20:15:00','2016-09-27 20:29:59',N'545BD826-0C9A-408B-BE9F-4C3D7D307948',1,'2016-09-27 14:15:00','2016-09-27 21:45:00',N'NULL',N'1',N'2016-09-27 16:45:00',N'2016-09-27 21:45:00',N'NULL',N'1',N'2016-09-27 18:00:00',N'2016-09-27 21:15:00',N'1'),
(9,27,2016,21,3,'2016-09-27 20:30:00','2016-09-27 20:44:59',N'545BD826-0C9A-408B-BE9F-4C3D7D307948',1,'2016-09-27 14:15:00','2016-09-27 21:45:00',N'NULL',N'1',N'2016-09-27 16:45:00',N'2016-09-27 21:45:00',N'1',N'1',N'2016-09-27 18:00:00',N'2016-09-27 21:15:00',N'2'),
(9,27,2016,21,4,'2016-09-27 20:45:00','2016-09-27 20:59:59',N'545BD826-0C9A-408B-BE9F-4C3D7D307948',1,'2016-09-27 14:15:00','2016-09-27 21:45:00',N'2',N'1',N'2016-09-27 16:45:00',N'2016-09-27 21:45:00',N'NULL',N'1',N'2016-09-27 18:00:00',N'2016-09-27 21:15:00',N'1'),
(9,27,2016,22,1,'2016-09-27 21:00:00','2016-09-27 21:14:59',N'545BD826-0C9A-408B-BE9F-4C3D7D307948',1,'2016-09-27 14:15:00','2016-09-27 21:45:00',N'2',N'1',N'2016-09-27 16:45:00',N'2016-09-27 21:45:00',N'NULL',N'1',N'2016-09-27 18:00:00',N'2016-09-27 21:15:00',N'NULL'),
(9,27,2016,22,2,'2016-09-27 21:15:00','2016-09-27 21:29:59',N'545BD826-0C9A-408B-BE9F-4C3D7D307948',1,'2016-09-27 14:15:00','2016-09-27 21:45:00',N'NULL',N'1',N'2016-09-27 16:45:00',N'2016-09-27 21:45:00',N'1',N'NULL',N'NULL',N'NULL',N'NULL'),
(9,27,2016,22,3,'2016-09-27 21:30:00','2016-09-27 21:44:59',N'545BD826-0C9A-408B-BE9F-4C3D7D307948',1,'2016-09-27 14:15:00','2016-09-27 21:45:00',N'NULL',N'1',N'2016-09-27 16:45:00',N'2016-09-27 21:45:00',N'NULL',N'NULL',N'NULL',N'NULL',N'NULL');`

Конечная цель та же. Я хочу иметь возможность сравнивать итоговые значения для «контролируемых» интервалов, как описано в моем исходном посте. Как я могу использовать таблицу календаря, чтобы найти интервалы типа

  • Ключ, A и B с 12:00 до 16:00
  • Ключ и A с 9:00 до 12:00
  • Ключ и A с 4 вечера - 6 вечера

и подсчитать количество событий в каждом соответствующем 15-минутном приращении, которые будут перетекать в общее количество за искомый интервал?

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