移动平均线上的 Oracle SQL 查询

问题描述

一个包含网站流量超过 30 天的数据库。 第一个表包含用户信息,包括用户类型(usercrawleradmin)。 第二个表包括每次访问网站的时间、访问者的ID、在网站上花费的时间(以秒为单位)。

我需要一个 Oracle sql 查询显示 users.user_type = 'user' 在网站上花费的 3 天移动平均时间。

表格:-

用户:-

ID 姓名 用户类型
1 马特 用户
2 约翰 用户
3 路易 管理员

交通:-

user_id visited_on time_spent
1 2019-05-01 15
2 2019-05-02 20
2 2019-05-03 10

预期输出

visited_on Average_time_spent
2019-05-01 15.0000
2019-05-02 17.5000
2019-05-03 15.0000

解决方法

如果我理解得很好,下面的选择语句对你有用

create table Users (Id,Name,User_type) as (
select 1,'Matt','user' from dual union all
select 2,'John','user' from dual union all
select 3,'Louie','Admin' from dual
)
;

create table Traffic (user_id,visited_on,time_spent) as (
select 1,date '2019-05-01',15 from dual union all
select 2,date '2019-05-02',20 from dual union all 
select 2,date '2019-05-03',10 from dual
)
;

select t.VISITED_ON,avg(t.TIME_SPENT)over(
    order by t.VISITED_ON
       range between interval '2' day preceding and interval '0' day following
) Average_time_spent
from Users u
join Traffic t on u.Id = t.user_id
where u.User_type = 'user'
;

,

您可以使用(如果您希望每天以 3 天平均值为中心):

SELECT visited_on,AVG( time_spent ) OVER (
         ORDER BY visited_on
         RANGE BETWEEN INTERVAL '1' DAY PRECEDING AND INTERVAL '1' DAY FOLLOWING
       ) AS average_time_spent
FROM   traffic t
WHERE  EXISTS (
         SELECT 1
         FROM   users u
         WHERE  u.id = t.user_id
         AND u.user_type = 'user'
       )
ORDER BY visited_on

对于样本数据:

CREATE TABLE users ( Id,User_type ) AS
SELECT 1,'user' FROM DUAL UNION ALL
SELECT 2,'user' FROM DUAL UNION ALL
SELECT 3,'Admin' FROM DUAL;

CREATE TABLE traffic ( user_id,time_spent ) AS
SELECT 1,DATE '2019-05-01',15 FROM DUAL UNION ALL
SELECT 2,DATE '2019-05-02',20 FROM DUAL UNION ALL
SELECT 2,DATE '2019-05-03',10 FROM DUAL;

输出:

VISITED_ON | AVERAGE_TIME_SPENT
:--------- | -----------------:
01-MAY-19  |               17.5
02-MAY-19  |                 15
03-MAY-19  |                 15

如果您希望移动平均线是当天和前 2 天,那么您可以更改范围:

SELECT visited_on,AVG( time_spent ) OVER (
         ORDER BY visited_on
         RANGE BETWEEN INTERVAL '2' DAY PRECEDING AND INTERVAL '0' DAY FOLLOWING
       ) AS average_time_spent
FROM   traffic t
WHERE  EXISTS (
         SELECT 1
         FROM   users u
         WHERE  u.id = t.user_id
         AND u.user_type = 'user'
       )
ORDER BY visited_on

输出:

VISITED_ON | AVERAGE_TIME_SPENT
:--------- | -----------------:
01-MAY-19  |                 15
02-MAY-19  |               17.5
03-MAY-19  |                 15

dbfiddle here