PostgreSQL три столбца с количеством уникальных диапазонов дат - PullRequest
0 голосов
/ 02 октября 2018

Мне нужен запрос, чтобы получить количество уникальных / уникальных идентификаторов сотрудников, которые работали за месяц в каждом отделе.

Итак, мне нужен список отдельных отделов сотрудников, возвращенных в одном столбце, а затем счетиз того, сколько уникальных идентификаторов сотрудников было синхронизировано в этом месяце во втором столбце, сколько уникальных сотрудников было синхронизировано в прошлом месяце в третьем столбце, а затем сколько тактов за месяц до этого в четвертом столбце.

Конечный результатдолжно выглядеть примерно так:

| DeptID | ThisMonth | LastMonth | MonthBefore |
------------------------------------------------
1001, 2, 3, 2  
1002, 4, 5, 2  
1003, 5, 7, 3  

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

До сих пор я пробовал варианты следующего запроса:

SELECT
DISTINCT P.DepartmentID AS "DeptID",
--COUNT(DISTINCT CI.EmployeeID),
(SELECT COUNT(DISTINCT CI.EmployeeID) WHERE (ShiftStart >= 
(DATE_TRUNC('month',NOW())) AND ShiftEnd <= (DATE_TRUNC('month',NOW()) + '1 month'::INTERVAL - '1 day'::INTERVAL))),
(SELECT COUNT(DISTINCT CI.EmployeeID) WHERE (ShiftStart >= (DATE_TRUNC('month',NOW()) - '1 month'::INTERVAL) AND ShiftEnd <= (DATE_TRUNC('month',NOW()) - '1 day'::INTERVAL))),
(SELECT COUNT(DISTINCT CI.EmployeeID) WHERE (ShiftStart >= (DATE_TRUNC('month',NOW()) - '2 month'::INTERVAL) AND ShiftEnd <= (DATE_TRUNC('month',NOW()) - '1 month'::INTERVAL - '1 day'::INTERVAL)))
FROM TimeClock CI
INNER JOIN dbo.Personnel P ON CI.EmployeeID = P.RecordID
WHERE ShiftStart >= (DATE_TRUNC('month',NOW()) - '2 month'::INTERVAL)
AND ShiftEnd <= (DATE_TRUNC('month',NOW()) + '1 month'::INTERVAL - '1 day'::INTERVAL)
GROUP BY P.DepartmentID, CI.ShiftStart, CI.ShiftEnd--, CI.EmployeeID

Проблема, с которой я столкнулся, заключается вдепартаменты дублируются - скорее всего, из-за начальной и конечной отметок смен, находящихся в ГРУППЕ.Я бы предпочел не разбивать это на несколько запросов, если это возможно.

1 Ответ

0 голосов
/ 02 октября 2018

Похоже, условная агрегация может помочь вам.Честно говоря, я не получаю вашу схему из запроса, поэтому могу опубликовать только шаблон, как это выглядит в целом.Вам придется выяснить все остальное.

SELECT <departmentid>,
       count(DISTINCT
             CASE
               WHEN <shift is this month> THEN
                 <userid>
             END),
       count(DISTINCT
             CASE
               WHEN <shift is last month> THEN
                 <userid>
             END),
       count(DISTINCT
             CASE
               WHEN <shift is from two months ago> THEN
                 <userid>
             END)
       FROM <from clause maybe with joins>
       WHERE <shifts are from now to two months ago>
       GROUP BY <departmentid>;

(Все элементы в <> означают заполнители.)

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