在带有双向图信息的SQL表上使用自联接,联合或其他一些操作

问题描述

如果我有一张桌子:

 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,minutesselect 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;

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...