我需要一个查询来返回每个部门每月上班的不同/唯一员工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中。如果可能,我希望不要将其分解为多个查询。
答案 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>;
(<>
中的所有内容均用作占位符。)