mysql-所有用户每小时的聚合结果

xzabzqsa  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(323)

我有一张像下面这样的table。
我实际上试图做一个选择汇总报告在两个案件。

+---------------------+---------------+-----------------+
| 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:平均每分钟打开所有用户的页面

输出示例:

+--------+-------+------------+
| 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:谁在一分钟内打开了max页面

在12:27:02,user2连接了两次,总共打开了48页。所以他在最短的27页有最高的开放页面。像这样,我要计算每一分钟。
我不知道如何为此生成查询。
有人能帮我回答这两个问题吗?

zvms9eto

zvms9eto1#

给定小时内每分钟/用户的平均打开页面数。 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

此查询将生成每个给定小时打开的\u页的总和。它让每个用户都可见,但我不知道yoo如何每分钟只选择一行。也许在应用程序端最简单的方法是,使用每分钟的第一行?

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

编辑我不得不花一些时间在这个问题上,因为这是我个人的兴趣。我认为这个查询可能会给你一个列表,列出每小时分钟打开的页面最多的用户。必须使用一个派生的temp表,一个正在运行的@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

相关问题