Среднее число open_pages в минуту / пользователя на данный час.
ts=timestamp, un=username, op=openpges
Select minute(op.ts) as mm, un, cast(avg(op) as int) as avgop
From openpages op
Where (op.ts between '2018-09-19 12:00:00' and '2018-09-19 12:59:59.999')
Group By minute(op.ts), un
Order By op.ts
Этот запрос составляет сумму open_pages за данный час.В нем виден каждый пользователь, но я не знаю, как вы можете выбирать только одну конкретную строку в минуту.Может быть, проще всего это сделать на стороне приложения, используя первую строку с каждой минутой?
Select minute(op.ts) as mm, un, sum(op) as sumop
From openpages op
Where (op.ts between '2018-09-19 12:00:00' and '2018-09-19 12:59:59.999')
Group By minute(op.ts), un
Order By sumop desc
Вы можете поместить SUM и AVG в один и тот же запрос, если нужно выполнить окончательную фильтрацию на стороне приложения.Этот один запрос предназначен для того, чтобы дать оба ответа.
Select minute(op.ts) as mm, un, sum(op) as sumop
, cast(avg(op) as int) as avgop
From openpages op
Where (op.ts between '2018-09-19 12:00:00' and '2018-09-19 12:59:59.999')
Group By minute(op.ts), un
Order By sumop desc
edit Мне пришлось потратить некоторое время на этот вопрос, так как это был личный интерес.Я думаю, что этот запрос может дать вам список пользователей, имеющих самые большие open_pages за данный час минут.Пришлось использовать производную временную таблицу, работающую @variable и сделать фильтрацию верхнего уровня на основе этой переменной.
set @mm=-1;
Select
CASE WHEN @mm=aTemp.mm THEN 0
ELSE 1
END as rn,
@mm:=aTemp.mm as mm,
aTemp.un, aTemp.sumop
From (
Select minute(op.ts) as mm, un, sum(op) as sumop
From openpages op
Where (op.ts between '2018-09-19 12:00:00' and '2018-09-19 12:59:59.999')
Group By minute(op.ts), un
Order By sumop desc
) aTemp
Having rn=1