Запрос средней продолжительности звонка для всех пользователей за день - PullRequest
5 голосов
/ 17 октября 2008

Человек использует свой мобильный телефон несколько раз в день, и продолжительность его звонков варьируется. Я отслеживаю продолжительность звонков в таблице:

Calls [callID, memberID, startTime, duration]

Мне нужен запрос для возврата средней продолжительности звонка для пользователей в день . За день означает, что если пользователь использовал телефон 3 раза, первый раз в течение 5 минут, второй в течение 10 минут и последний раз в течение 7 минут, расчет будет: 5 + 10 + 7 / 3 = ...

Примечание:

  1. Люди не пользуются телефоном каждый день, поэтому мы должны получить среднее значение за последний день на человека и использовать его для получения общей средней продолжительности разговора.

  2. мы не хотим подсчитывать кого-либо дважды в среднем, поэтому для расчета средней продолжительности ежедневного разговора будет использоваться только 1 строка на пользователя.

Некоторые уточнения ...

Мне нужно общее среднее значение за день, основанное на среднем значении для каждого пользователя в день, с использованием числа последних дней пользователей (поскольку в запросе мы учитываем только ОДНОГО пользователя), поэтому это будет означать используя разные дни поскольку люди могут не пользоваться телефоном каждый день или даже в один и тот же день.

Ответы [ 3 ]

1 голос
/ 17 октября 2008

Вам необходимо преобразовать DATETIME во что-то, из чего вы можете составить группы «на день», чтобы это выглядело как «гг / мм / дд».

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) для создания "гггг-мм-дд".

Для запросов такого типа было бы полезно иметь выделенный столбец "только на день", чтобы избежать всей конверсионной деятельности и, как побочный эффект, сделать запрос более читабельным.

1 голос
/ 17 октября 2008

Следующий запрос даст вам желаемые конечные результаты.

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, чтобы получить список участников

0 голосов
/ 17 октября 2008
select average(duration) from calls group by date(startTime);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...