Sql 基于不同列的列重叠

Sql 基于不同列的列重叠,sql,postgresql,postgresql-9.5,Sql,Postgresql,Postgresql 9.5,我有一个简单的Postgres表,其中包含了一周中的几天和人 INSERT INTO mytable (day, person) values ('Monday', 'A'), ('Monday', 'A'), ('Monday', 'B'), ('Tuesday', 'A'), ('Wednesday', 'A'), ('Wednesday', 'B'), ('Thursday', 'B'), ('Thursday', 'B'); 我想找出每两天重叠的人数。例如,星期一有人A和B。星期二只有

我有一个简单的Postgres表,其中包含了一周中的几天和人

INSERT INTO mytable (day, person)
values
('Monday', 'A'),
('Monday', 'A'),
('Monday', 'B'),
('Tuesday', 'A'),
('Wednesday', 'A'),
('Wednesday', 'B'),
('Thursday', 'B'),
('Thursday', 'B');
我想找出每两天重叠的人数。例如,星期一有人A和B。星期二只有人B,所以这将产生一行,如下所示:

('Monday', 'Tuesday', 1)
最终输出应如下所示:

('Monday', 'Monday', 2),
('Monday', 'Tuesday', 1),
('Monday', 'Wednesday', 2),
('Monday', 'Thursday', 1),
('Tuesday', 'Tuesday', 1),
('Tuesday', 'Monday', 1),
('Tuesday', 'Wednesday', 1),
('Tuesday', 'Thursday', 0),
('Wednesday', 'Wednesday', 2),
('Wednesday', 'Monday', 2),
('Wednesday', 'Tuesday', 1),
('Wednesday', 'Thursday', 1),
('Thursday', 'Thursday', 1),
('Thursday', 'Monday', 1),
('Thursday', 'Tuesday', 0),
('Thursday', 'Wednesday', 1)
我一直在玩弄交叉连接和交叉连接,但似乎没有什么能产生正确的结果。

使用自连接:

select t1.day, t2.day, count(distinct t2.person) as num_overlaps
from mytable t1 join
     mytable t2
     on t1.person = t2.person
group by t1.day, t2.day
order by t1.day, t2.day;
编辑:

我知道您也希望包含零重叠。这有点棘手。为此,您需要生成所有天数组合,然后加入数据:

select d1.day, d2.day, count(distinct t2.person)
from (select distinct day from mytable) d1 cross join
     (select distinct day from mytable) d2 left join
     mytable t1
     on t1.day = d1.day left join
     mytable t2
     on t2.day = d2.day and t2.person = t1.person
group by d1.day, d2.day
order by d1.day, d2.day;

是一个dbfiddle。

谢谢,我正在查看查询,但它没有产生正确的结果。当你亲自加入时,这可能是由于某一天的人吗?@user2242044。在第二个查询中,persons的=应该是。谢谢。我认为您只需要将左连接从mytable中选择distinct*,这样,如果一个人在同一天出现两次,我们就不会重复计算。或者类似的东西。似乎仍然不太正确。根据您的评论,t2是基于不同的人加入的,但它没有检查以确保这些日子共享一个相似的日子。我不确定我是否解释得很好,但看看周二、周四。查询结果为1,但结果应为0。@user2242044。我加了一把小提琴。我认为这是可行的。