mysql - агрегированные результаты за каждый час для всех пользователей - PullRequest
0 голосов
/ 02 октября 2018

У меня есть таблица, как показано ниже.

Я на самом деле пытаюсь сделать выборочный сводный отчет в 2 случаях.

+---------------------+---------------+-----------------+
| timestamp           | user          | open_pages      |
+---------------------+---------------+-----------------+
| 2018-09-19 12:27:02 | user1         |              66 |
| 2018-09-19 12:27:02 | user2         |              24 |
| 2018-09-19 12:27:10 | user2         |              24 |
| 2018-09-19 12:28:30 | user1         |              21 |
| 2018-09-19 12:28:30 | user2         |              20 |
| 2018-09-19 12:28:35 | user1         |              17 |
| 2018-09-19 12:28:35 | user2         |              11 |
| 2018-09-19 12:29:08 | user1         |               8 |
| 2018-09-19 12:29:08 | user2         |               8 |
| 2018-09-19 12:30:02 | user1         |               7 |
| 2018-09-19 12:30:02 | user2         |               6 |
+---------------------+---------------+-----------------+

Случай 1: Avg Открывать страницы всем пользователям каждую минуту

Пример вывода:

+--------+-------+------------+
| minute | User  | Open_pages |
+--------+-------+------------+
| 27     | User1 | 66         |
| 27     | User2 | 26         |
| 28     | user1 | 56         |
| 28     | user2 | 51         |
| 29     | user1 | 21         |
| 29     | user2 | 28         |
+--------+-------+------------+

Я пробовал этот запрос, но он не показывает правильные значения.

     select minute(timestamp), user, avg(open_pages) 
    from tbl where DATE(timestamp)= '2018-09-19' 
group by minute(timestamp) order by 1;

Случай 2: Кто открыл максимум страницчерез минуту

В 12: 27: 02 пользователь 2 подключился дважды и полностью открыл 48 страниц .таким образом, он имеет наибольшее количество открытых страниц при минимуме 27. Таким образом, я хочу вычислять каждую минуту.

Я не имею ни малейшего представления, как сгенерировать запрос для этого.

Кто-нибудь может мне помочь с этими двумя вопросами?

1 Ответ

0 голосов
/ 02 октября 2018

Среднее число 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
...