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

时间:2008-10-17 14:03:34

标签: sql sql-server sql-server-2005

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

Calls [callID, memberID, startTime, duration]

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

注意:

  1. 人们不会每天都使用手机,因此我们必须获得每人最新的平均值,并使用它来获得整体平均通话时间。

  2. 我们不希望平均每人计算两次,因此每位用户只需要一行计算平均每日通话时长。

  3. 一些澄清......

    我需要根据每位用户每日平均值,使用用户的最新天数(因为我们只计算查询中的给定用户ONCE)来计算每日平均值,因此这意味着我们将会使用不同的天平均因为人们可能不会每天或在同一天使用手机。

3 个答案:

答案 0 :(得分:1)

你需要将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 :(得分: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条记录以及最近一天的平均呼叫持续时间来完成的。然后它只是平均所有这些值以得到结束“平均呼叫持续时间。如果你想看到一个特定的用户,你可以只运行inser SELECT部分​​来获得成员列表

答案 2 :(得分:0)

select average(duration) from calls group by date(startTime);