Я думаю, что то, что вы хотите ...
Сначала вам понадобится файл календаря , если у вас его еще нет.
Во-вторых, определите таблицу Shift
. Это, вероятно, будет важно для отслеживания в любом случае, и имеет решающее значение здесь. Быстрое и грязное определение:
CREATE TABLE Shift (Shift INTEGER NOT NULL,
Start_Offset SMALLINT NOT NULL,
End_Offset SMALLINT NOT NULL,
CONSTRAINT Shift_PK PRIMARY KEY(Shift))
Данные для вставки:
INSERT INTO Shift VALUES(1, 6, 14), (2, 14, 22), (3, 22, 30)
Тогда вы сможете выполнить этот запрос:
SELECT a.Calendar_Date, b.Shift, COUNT(DISTINCT c.idusuario)
FROM calendar as a
CROSS JOIN Shift as b
JOIN associacao as c
ON c.dataassociacao >= a.Calendar_Date + ((INTERVAL '1 hours') * b.Start_Offset)
AND c.dataassociacao < a.Calendar_Date + ((INTERVAL '1 hours') * b.End_Offset)
GROUP BY a.Calendar_Date, b.Shift
ORDER BY a.Calendar_Date, b.Shift
В результате:
Calendar_Date Shift Count
=======================================
2011-08-24 3 2
2011-08-25 1 1
2011-08-25 2 2
(Обратите внимание: я выполнил всю работу по сборке / тестированию в DB2, у которой нет функций интервалов. Из просмотра документации и связанной информации в Интернете данный запрос должен быть эквивалентным тому, что Я написал, но не могу проверить на экземпляре PostgreSQL).