Я хочу получить общее среднее время использования пользователей за день за последние 7 дней. Я написал SQL для среднего времени каждого пользователя, оно идет отлично, но у меня есть проблемы с функцией LARAVEL SQL, пожалуйста, помогите исправить этот SQL.
$currentTime = Carbon::today();
$userUsage = DB::table('active_user')
->select(DB::raw('acu_name as name'),
DB::raw('u_fname as fname'),
DB::raw('AVG(TIMESTAMPDIFF(MINUTE,acu_at,acu_et)) as averageTime'),
DB::raw('count(*) as number'))
->join('u_info_one', 'active_user.acu_name', '=', 'u_info_one.u_email')
->whereDate('acu_at', '<=', $currentTime)
->groupBy('acu_name')
->get();






Для этого вам нужно использовать GROUP BY, например:
$userUsage = DB::table('active_user')
->select(DB::raw('acu_name as name'),
DB::raw('u_fname as fname'),
DB::raw('AVG(TIMESTAMPDIFF(MINUTE,acu_at,acu_et)) as averageTime'),
DB::raw('count(*) as number'))
->join('u_info_one', 'active_user.acu_name', '=', 'u_info_one.u_email')
->whereDate('acu_at', '<=', $currentTime)
->groupBy('acu_name', DB::raw('DATE(acu_at)'))
->get();
Обновить
Если вам просто нужно среднее значение за день для всех пользователей, вы можете удалить acu_name из группы, например:
$userUsage = DB::table('active_user')
->select(DB::raw('acu_name as name'),
DB::raw('u_fname as fname'),
DB::raw('AVG(TIMESTAMPDIFF(MINUTE,acu_at,acu_et)) as averageTime'),
DB::raw('count(*) as number'))
->join('u_info_one', 'active_user.acu_name', '=', 'u_info_one.u_email')
->whereDate('acu_at', '<=', $currentTime)
->groupBy(DB::raw('DATE(acu_at)'))
->get();
это среднее значение для каждого пользователя или среднее общее количество пользователей?
Я хочу, чтобы результат выглядел так: totaverage = (acu_at - acu_et)/всего пользователей
Да, это даст вам среднее значение за каждый acu_name в день.
мне нужно среднее количество пользователей в день
прикрепил результат
<?php foreach($userUsage as $usUa) { $aveTime = (($usUa->number)/($usUa->averageTime)); echo "['".$usUa->date."',".$aveTime."],"; } ?> этот метод правильный или нет за день общее время разделить на общее количество пользователей
Правильный ответ
$userUsage = DB::table('active_user')
->select(DB::raw('DATE(acu_at) as date'),
DB::raw('AVG(TIMESTAMPDIFF(MINUTE,acu_at,acu_et)) as averageTime'),
DB::raw('COUNT(DISTINCT `acu_name`) as users'))
->join('u_info_one', 'active_user.acu_name', '=', 'u_info_one.u_email')
->whereDate('acu_at', '<=', $currentTime)
->groupBy(DB::raw('DATE(acu_at)'))
->orderBy(DB::raw('DATE(acu_at)'))
->get();
foreach($userUsage as $usUa)
{
$avegTime = ($usUa->averageTime/$usUa->users);
echo "['".$usUa->date."',".$avegTime."],";
}
Пожалуйста, используйте только связанные теги в своем вопросе.