我想通过SQL找出两个人通话的时长。假设"Joe“呼叫"Mak”并讲了5分钟,"Mak“呼叫"Joe”15分钟,那么总时长必须为20分钟。
我尝试了一些self join的方法,但得到了类似调用的重复项。
SELECT t1.cal1, t2.cal2,sum(t1.dur) as Total
from tele t1
INNER JOIN tele t2
ON (t1.cal1 = t2.cal1 AND t1.cal2 = t2.cal2)
GROUP BY T1.CAL1, T2.CAL2;
cal1 cal2 duration (in Mins)
A B 5
A B 10
B A 10
B A 25
A D 1
D C 2
B C 4
C B 9
C B 7
C A 2
D C 5
D B 10发布于 2019-05-19 04:05:59
更简单的方法是使用案例,这样您就可以获得col1和col2的唯一组合,然后按每个组合进行分组:
SELECT
case when cal1 < cal2 then cal1 else cal2 end col1,
case when cal1 < cal2 then cal2 else cal1 end col2,
SUM(duration) duration
FROM tele
GROUP BY col1, col2请参阅demo。
结果:
> col1 | col2 | duration
> :--- | :--- | -------:
> A | B | 50
> A | C | 2
> A | D | 1
> B | C | 20
> B | D | 10
> C | D | 7如果您使用SQLServer,则需要以下内容:
SELECT
case when cal1 < cal2 then cal1 else cal2 end col1,
case when cal1 < cal2 then cal2 else cal1 end col2,
SUM(duration) duration
FROM tele
GROUP BY
case when cal1 < cal2 then cal1 else cal2 end,
case when cal1 < cal2 then cal2 else cal1 end或者将CASE语句替换为
发布于 2019-05-19 03:53:23
您必须在子查询中动态设置列,并再次对结果进行分组,以获得所需的结果:
SELECT
col1, col2, SUM(duration)
FROM
(
SELECT
IF(cal1 < cal2, cal1, cal2) AS col1,
IF(cal1 < cal2, cal2, cal1) AS col2,
SUM(duration) AS duration
FROM
tel
GROUP BY
cal1,
cal2
) AS m
GROUP BY
col1,
col2发布于 2019-05-19 03:38:16
如果调用A到B等同于调用B到A,那么创建一个由双方名称组成的组合列(例如AB )可能会有所帮助,其中名称在组合中的顺序由字符串的排序顺序确定。
例如,CASE WHEN A < B THEN A + B ELSE B + A END AS party_names。
这将确保从A到B的呼叫以及从B到A的呼叫都会产生AB的party_names。
然后,您可以分组并选择该列,然后选择SUM(持续时间)。
https://stackoverflow.com/questions/56202199
复制相似问题