首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >2人通话总时长

2人通话总时长
EN

Stack Overflow用户
提问于 2019-05-19 03:28:04
回答 4查看 651关注 0票数 2

我想通过SQL找出两个人通话的时长。假设"Joe“呼叫"Mak”并讲了5分钟,"Mak“呼叫"Joe”15分钟,那么总时长必须为20分钟。

我尝试了一些self join的方法,但得到了类似调用的重复项。

代码语言:javascript
复制
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
EN

回答 4

Stack Overflow用户

发布于 2019-05-19 04:05:59

更简单的方法是使用案例,这样您就可以获得col1和col2的唯一组合,然后按每个组合进行分组:

代码语言:javascript
复制
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

结果:

代码语言:javascript
复制
> col1 | col2 | duration
> :--- | :--- | -------:
> A    | B    |       50
> A    | C    |        2
> A    | D    |        1
> B    | C    |       20
> B    | D    |       10
> C    | D    |        7

如果您使用SQLServer,则需要以下内容:

代码语言:javascript
复制
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语句替换为

票数 3
EN

Stack Overflow用户

发布于 2019-05-19 03:53:23

您必须在子查询中动态设置列,并再次对结果进行分组,以获得所需的结果:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 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(持续时间)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56202199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档