您可以使用(如果您希望以每天为中心的 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, 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;
输出:
VISITED_ON | AVERAGE_TIME_SPENT
:--------- | -----------------:
19 年 5 月 1 日 | 17.5
19 年 5 月 2 日 | 15
19 年 5 月 3 日 | 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
:--------- | -----------------:
19 年 5 月 1 日 | 15
19 年 5 月 2 日 | 17.5
19 年 5 月 3 日 | 15
db小提琴here