问题描述
如果我有一张桌子:
talker | listener | minutes
--------+----------+---------
sue | rob | 3
sue | jan | 2
jan | sue | 1
rob | sue | 7
jan | sue | 4
rob | sue | 6
rob | jan | 5
dan | jan | 5
sue | abe | 9
确定每个人的总交谈时间的最佳方法是什么?示例:
name | minutes
-----+--------
dan | 5
abe | 9
rob | 21
sue | 32
jan | 17
(假设我正确添加了。)
此外,我想知道是否可以通过自连接或其他机制使初始表的大小增加一倍。 (目标是用select talker as name,minutes
和select listener as name,minutes
合并成一个表。)
一些帮助:
create table discussions(talker varchar(10),listener varchar(10),minutes INT);
insert into discussions(talker,listener,minutes) values ('sue','rob',3);
insert into discussions(talker,'jan',2);
insert into discussions(talker,minutes) values ('jan','sue',1);
insert into discussions(talker,minutes) values ('rob',7);
insert into discussions(talker,4);
insert into discussions(talker,6);
insert into discussions(talker,5);
insert into discussions(talker,minutes) values ('dan','abe',9);
解决方法
select name,sum(minutes)
from
(
select talker as name,minutes from discussions
union all
select listener,minutes from discussions
) tmp
group by name
,
使用join方法可以达到相同的结果:
SELECT (COALESCE(TALKER_MINS,0) + COALESCE(LISTENER_MINS,0)) AS MINUTES,COALESCE(X.TALKER,Y.LISTENER) as NAME FROM (
SELECT SUM(MINUTES) TALKER_MINS,A.TALKER FROM discussions A GROUP BY TALKER) X
FULL OUTER JOIN
(SELECT SUM(MINUTES) LISTENER_MINS,A.listener FROM discussions A GROUP BY listener) Y
ON X.TALKER = Y.LISTENER ORDER BY 1;
,
使用CTE的逻辑略有不同。它很可能会比接受的答案更糟糕,但是我将其留在这里,以便您可以自己进行测试-可以按原样进行测试,也可以使用临时表或子查询将其重写。
with cte (name,minutes) as
(select talker,sum(minutes)
from discussions
group by talker
union all
select listener,sum(minutes)
from discussions
group by listener)
select name,sum(minutes)
from cte
group by name;