查询所有用户一天的平均通话时长

Posted

技术标签:

【中文标题】查询所有用户一天的平均通话时长【英文标题】:Query for the average call length for all users for a day 【发布时间】:2008-10-17 14:03:33 【问题描述】:

一个人每天使用手机多次,通话时长各不相同。我正在跟踪表格中调用的长度:

Calls [callID, memberID, startTime, duration]

我需要查询以返回用户每天的平均通话时长。每天的意思是,如果用户使用手机3次,第一次5分钟,第二次10分钟,最后一次7分钟,计算为:5 + 10 + 7 / 3 = ...

注意:

    人们并非每天都使用电话,因此我们必须获取每人最近一天的平均值,并以此来获取总体平均通话时长。

    我们不想将任何人平均计算两次,因此每个用户只需 1 行来计算平均每日通话时长。

一些澄清...

我需要基于每个用户每天的平均值,使用用户最近的天数(因为我们只在查询中计算给定用户 ONCE),所以这意味着我们将平均使用不同的天数。因为人们可能不会每天甚至在同一天使用手机。

【问题讨论】:

我不确定我是否理解您的说明。总体平均值如何取决于“最新日期”?对于几个不同的人,您想要的结果如何? 好吧,我们不想在同一个查询中计算两次,所以每个用户只有一个平均值会进入全球平均值。 所以您想根据每位用户每天的平均数来计算总体每天的平均数? 我想要一个总体的每日平均值,基于每个用户每天的平均值,使用用户最近的天数(因为我们只在查询中计算给定用户一次),所以它意味着我们将使用不同的天数。因为人们可能不会每天都使用手机 我添加了一些 SQL,只选择每个用户的最新日期。 【参考方案1】:

以下查询将为您提供所需的最终结果。

SELECT AVG(rt.UserDuration) AS AveragePerDay
FROM
(
    SELECT
        c1.MemberId,
        AVG(c1.Duration) AS "UserDuration"
    FROM Calls c1
    WHERE CONVERT(VARCHAR, c1.StartTime, 102) =
        (SELECT CONVERT(VARCHAR, MAX(c2.StartTime), 102)
            FROM Calls c2
            WHERE c2.MemberId = c1.MemberId)
    GROUP By MemberId
) AS rt

首先创建一个表,其中包含每个成员的 1 条记录以及他们最近一天通话的平均持续时间。然后它简单地对所有这些值进行平均以获得最终的“平均通话持续时间”。如果您想查看特定用户,您可以只运行 innser SELECT 部分来获取成员列表

【讨论】:

运行内部查询(在 from 内部)返回:聚合可能不会出现在 WHERE 子句中,除非它在包含在 HAVING 子句或选择列表中的子查询中,并且正在聚合的列是外部参考。 我刚刚测试了一个您可以运行从“SELECT c1.MemberId”城镇到“Group BY MemberId”语句的所有内容。 我知道你需要什么!【参考方案2】:

您需要将 DATETIME 转换为可以在其上创建“每天”组的内容,因此这将产生“yy/mm/dd”。

SELECT
  memberId,
  CONVERT(VARCHAR, startTime, 102) Day,
  AVG(Duration) AvgDuration
FROM
  Calls
WHERE
  CONVERT(VARCHAR, startTime, 102) = 
  (
    SELECT 
      CONVERT(VARCHAR, MAX(startTime), 102) 
    FROM 
      Calls i WHERE i.memberId = Calls.memberId
  )
GROUP BY
   memberId,
   CONVERT(VARCHAR, startTime, 102)

使用LEFT(CONVERT(VARCHAR, startTime, 120), 10) 生成“yyyy-mm-dd”。

对于这类查询,有一个专门的“仅限日期”列将有助于避免整个转换业务,并作为副作用使查询更具可读性。

【讨论】:

每个成员返回多行,我只需要最新的一行(只有 1 行,最新的一行) 那么你只需要按日期字段分组(CONVERT(VARCHAR, startTime, 102)) 但是“每个成员”的平均值也会消失。 您的查询中存在语法错误,因为没有名为 member 的表,并且它没有得到用户要求的总体平均值。 引用:“我们必须得到最近一天的人均数据”。我认为海报能够围绕它放置一个简单的 SELECT AVG。你说得对,而且没有叫做“会员”的表,干得好。 ;-)【参考方案3】:
select average(duration) from calls group by date(startTime);

【讨论】:

date() 不是 SQL Server 上的函数。 问题最初被标记为mysql

以上是关于查询所有用户一天的平均通话时长的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 React native android 中检测最近的电话通话时长

1034 Head of a Gang

Python数据分析用户通话行为分析

巧妙的 webrtc 群组通话 无法在 Javascript 和简单对等中工作

Xamarin 表单获取通话时间

实现电话通话长度监控 iOS