问题描述
有一个包含网站流量超过 30 天的数据库。
第一个表包含用户信息,包括用户类型(user
、crawler
、admin
)。
第二个表包括每次访问网站的时间、访问者的ID、在网站上花费的时间(以秒为单位)。
我需要一个 Oracle sql 查询来显示 users.user_type = 'user'
在网站上花费的 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