PostgreSQL三列,每个唯一日期范围的计数

时间:2018-10-02 16:28:44

标签: sql postgresql postgresql-9.6

我需要一个查询来返回每个部门每月上班的不同/唯一员工ID的计数。

因此,我需要在第一列中返回一个不同的员工部门列表,然后在第二列中计算出该月中有多少个唯一的员工ID,在第三列中计算出上个月中有多少个独特的员工,然后第四栏中的前一个月有多少时钟。

最终结果应如下所示:

| 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

我遇到的问题/问题是部门编号重复-最有可能是因为该班次的开始和结束时间戳记在GROUP中。如果可能,我希望不要将其分解为多个查询。

1 个答案:

答案 0 :(得分:0)

类似条件聚合的声音可以为您提供帮助。老实说,我不会从查询中获取您的架构,因此我只能向您发布一个模板,其外观通常如此。您必须找出其余的内容。

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>;

<>中的所有内容均用作占位符。)