如何实现PostgreSQL完全连接:按天统计事件数

如何实现PostgreSQL完全连接:按天统计事件数,postgresql,Postgresql,我试图统计一天内发生和解决的事故数量。存储为“事故”的数据如下所示。每个发生的事故都分配了唯一的事故问题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', '

我试图统计一天内发生和解决的事故数量。存储为“事故”的数据如下所示。每个发生的事故都分配了唯一的事故问题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;

在子查询中按雇员和日期进行聚合,并在普通日期和雇员完全联接它们

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;

您可以发布当前输出的样子吗?您可以发布当前输出的样子吗?coalesce函数在“coalesce(o.empid,r.empid)empid”和“coalesce(o.day,r.day)date”中的作用是什么?我的快速研究表明,coalesce函数返回第一个非null值,但在empid或day中不应该有任何null。此外,当一天内没有发生或解决任何事故时,代码将返回“null”。我如何将其更改为0?@kunichi_kimura:是的,可以有空值,因为它是一个完全连接,所以可能一个值只存在于一个“边”。要获取所有日期(您感兴趣),您需要创建一组所有日期(您感兴趣),例如,使用
generate_series
并左键连接到该日期。这方面有很多问题。如果你在这方面有困难,我建议你问一个新问题。别忘了告诉你想要的天数应该是什么样子。coalesce函数在“coalesce(o.empid,r.empid)empid”和“coalesce(o.day,r.day)date”中的作用是什么?我的快速研究表明,coalesce函数返回第一个非null值,但在empid或day中不应该有任何null。此外,当一天内没有发生或解决任何事故时,代码将返回“null”。我如何将其更改为0?@kunichi_kimura:是的,可以有空值,因为它是一个完全连接,所以可能一个值只存在于一个“边”。要获取所有日期(您感兴趣),您需要创建一组所有日期(您感兴趣),例如,使用
generate_series
并左键连接到该日期。这方面有很多问题。如果你在这方面有困难,我建议你问一个新问题。别忘了告诉你你想要的日子应该是什么样子。