基于其他列的列重叠

时间:2019-03-20 02:56:58

标签: sql postgresql postgresql-9.5

我在Postgres中有一个简单的表格,其中包含星期几和其他人。

If myStoryboard.GetCurrentState(containingObject:=Me) = Animation.ClockState.Active Then

我想找到每一天重叠的人数。例如,星期一有一个人A和B。星期二只有一个人B,因此将产生如下一行:

INSERT INTO mytable (day, person)
values
('Monday', 'A'),
('Monday', 'A'),
('Monday', 'B'),
('Tuesday', 'A'),
('Wednesday', 'A'),
('Wednesday', 'B'),
('Thursday', 'B'),
('Thursday', 'B');

最终输出应如下所示:

('Monday', 'Tuesday', 1)

我一直在玩交叉连接和相交,但是似乎没有任何东西可以产生正确的结果。

1 个答案:

答案 0 :(得分:3)

使用自我联接:

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;

Here是db <>小提琴。