我需要设备的 3 个新列:(1) 10 月 3 日至 5 日的总和,无论哪一天 (2) 使用前一天的 10 月 3 日至 5 日的滚动总和,(3) 10 月 3 日至 5 日的滚动总和日期为 10 月 3 日至 5 日,使用之前的最后 3 天。
我尝试过的:
SELECT
day, country, device,
SUM(num_visits) OVER (partition by device ORDER BY day ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS device_visits,
SUM(num_visits) OVER (partition by device ORDER BY day ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS device_visits_1day,
SUM(num_visits) OVER (partition by device ORDER BY day ROWS BETWEEN 3 PRECEDING AND 1 PRECEDING) AS device_visits_3days
FROM tbl
但是,在我的结果中,我得到的唯一“日”列是较早的日期(2024-09-30,2024-10-01, 2024-10-02)而不是(2024-10-03, 2024-10-04 , 2024-10-05)
此外,我无法满足(1),无论哪天总和都相同。
您可以在内部查询中获取开始-结束日期、前一天的 num_visits 以及前 3 天的 num_visits 总和,然后在外部查询中获取最近三天的总和(通过Where子句过滤):
样本数据
白天 | 国家 | 设备 | NUM_VISITS |
---|---|---|---|
24 年 9 月 30 日 | 美国 | 手机 | 50 |
24 年 10 月 1 日 | 美国 | 手机 | 100 |
24 年 10 月 2 日 | 美国 | 手机 | 150 |
24 年 10 月 3 日 | 美国 | 手机 | 200 |
24 年 10 月 4 日 | 美国 | 手机 | 100 |
24 年 10 月 5 日 | 美国 | 手机 | 100 |
-- S Q L :
Select day, country, device,
Sum(num_visits) Over(Partition By device) as device_visits,
device_visits_1day, device_visits_3day
From ( Select day, country, device, num_visits,
Max(day) Over(Partition By device) - 2 as device_start_day,
Max(day) Over(Partition By device) as device_end_day,
Lag(num_visits) Over(Partition By device Order By day) as device_visits_1day,
Sum(num_visits) Over(Partition By device Order By day
Rows Between 3 Preceding And 1 Preceding) as device_visits_3day
From tbl
)
Where day Between device_start_day And device_end_day
Order By device, day;
结果:
白天 | 国家 | 设备 | 设备访问 | DEVICE_VISITS_1DAY | DEVICE_VISITS_3DAY |
---|---|---|---|---|---|
24 年 10 月 3 日 | 美国 | 手机 | 400 | 150 | 300 |
24 年 10 月 4 日 | 美国 | 手机 | 400 | 200 | 450 |
24 年 10 月 5 日 | 美国 | 手机 | 400 | 100 | 450 |
注意:使用 Oracle SQL 进行测试,但使用标准 ANSI 语法,因此它也应该适用于 presto....