我在统计一天内发生并解决的事故数量。存储为“意外”的数据如下所示。每个发生的事故都有唯一的事故问题ID,以及解决该问题的雇主ID。请注意,有些事故并没有在发生的同一天得到解决,还有一些事故是同时发生的。

INSERT INTO Accidents (empid, accident_issue, accident_date, resolved_date) VALUES
('abcd', 'a49b0a4k', '3/12/19 13:25', '3/12/19 13:37'),
('abcd', 'ao3jbvna', '2/1/19 21:16', '2/1/19 21:19'),
('abcd', 'g4b04kcd', '12/12/18 20:37', '12/12/18 21:34'),
('abcd', 'hk9502jb', '12/10/18 21:09', '12/10/18 21:13'),
('abcd', 'cj9rj4vb', '11/30/18 19:44', '11/30/18 19:49'),
('abcd', 'd948mafg', '11/24/18 19:53',  '11/26/18 19:55'),
('abcd', 'mkgiud84', '11/24/18 12:48',  '11/25/18 14:37'),
('abcd', 'it93hvmv', '11/24/18 12:48',  '11/25/18 15:29'),
('efgh', '94jbniv4', '5/17/18 19:56', '5/17/18 20:11'),
('efgh', '5k0bnck5', '4/13/18 15:07', '4/13/18 15:13'),
('efgh', 'mborj3hf', '2/28/18 21:32', '2/28/18 21:51'),
('efgh', 'vkrok4mn', '2/21/18 16:19', '2/21/18 16:35'),
('efgh', '2ivj39cn', '2/20/18 22:01', '2/20/18 22:06'),
('efgh', '0virj3mv', '2/20/18 16:21', '2/20/18 16:23'),
('efgh', 'x20xzn93', '2/9/18 21:16', '2/10/18 21:30'),
('efgh', '49jcn3k5', '2/6/18 19:35', '2/8/18 22:36');

我希望查询结果能显示出每个雇主每天分配和解决的事故数量。
我最初的想法是先分别计算出事故数量和每天解决的事故数量,然后将两个表完全合并。
这是我到目前为止一直在工作的代码。
SELECT
    a.empid,
    a.date,
    a.number_of_accidents,
    b.number_resolved
FROM
    (SELECT A1.empid, A1.accident_issue, to_char(accident_date::date, 'yyyy-mm-dd') as date,
              count(accident_date) as number_of_accidents
     FROM Accidents as A1
       GROUP BY A1.empid, A1.accident_issue
     ) AS a
FULL OUTER JOIN
    (SELECT B1.empid, B1.accident_issue, to_char(resolved_date::date, 'yyyy-mm-dd') as date,
              count(resolved_date) as number_resolved
     FROM Accidents as B1
       GROUP BY B1.empid, B1.accident_issue
     ) AS b
    ON a.date = b.date
    GROUP BY a.empid, a.date

当单独运行时,两个表a和b似乎返回了我想要的结果,但是当放在一起时,由于某种原因,输出会损坏并产生多个重复行。
我希望结果如下
| empid |    date   | number_of_accidents | number_solved |
|-------|-----------|---------------------|---------------|
| abcd  |  11/24/18 |           3         |       0       |
| abcd  |  11/25/18 |           0         |       2       |
| abcd  |  2/1/19   |           1         |       1       |
| abcd  |  3/12/19  |           1         |       1       |
| efgh  |  2/20/18  |           2         |       2       |
| efgh  |  2/21/18  |           1         |       1       |

有什么问题,我是不是走对了方向?
任何帮助都将不胜感激。谢谢您!

最佳答案

在子查询中按雇员和日期聚合,并在公共日和雇员时完全联接它们。

SELECT coalesce(o.empid, r.empid) empid,
       coalesce(o.day, r.day) date,
       o.count number_of_accidents,
       r.count number_resolved
       FROM (SELECT a.empid,
                    date_trunc('day', a.accident_date) day,
                    count(*) count
                    FROM accidents a
                    GROUP BY a.empid,
                             date_trunc('day', a.accident_date)) o
            FULL JOIN (SELECT a.empid,
                              date_trunc('day', a.resolved_date) day,
                              count(*) count
                              FROM accidents a
                              GROUP BY a.empid,
                                       date_trunc('day', a.resolved_date)) r
                      ON r.empid = o.empid
                         AND r.day = o.day;

关于postgresql - 如何进行PostgreSQL完全加入:按天计数事件数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55670190/

10-12 21:07