找出2人之间发生的通话总时长

时间:2019-05-18 19:28:04

标签: sql

我想通过SQL找出2个人之间的通话时间。 假设“乔”叫“ Mak”说了5分钟,而“马克”叫“ Joe”说了15分钟,则总持续时间必须为20分钟。

我尝试通过自加入进行某些操作,但此类调用得到了重复。

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

4 个答案:

答案 0 :(得分:3)

更简单的方法是使用CASE,以便获得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语句替换为

答案 1 :(得分:1)

您将必须在子查询中动态设置列,然后再次将其结果分组以实现所需的结果:

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

答案 2 :(得分:0)

如果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

然后您可以GROUP BY并选择该列和SUM(duration)。

答案 3 :(得分:0)

大多数数据库支持least()greatest()

select least(t.cal1, t2.cal2), greatest(t.cal1, t2.cal2),
       sum(t1.dur) as Total 
from tele t1 
group by least(t.cal1, t2.cal2), greatest(t.cal1, t2.cal2);

对于没有的数据库,可以改用case表达式。