单次查询中最近3天和1天的滚动总和

问题描述 投票:0回答:1

我有一张包含过去 6 天数据的表格: source table

我需要设备的 3 个新列:(1) 10 月 3 日至 5 日的总和,无论哪一天 (2) 使用前一天的 10 月 3 日至 5 日的滚动总和,(3) 10 月 3 日至 5 日的滚动总和日期为 10 月 3 日至 5 日,使用之前的最后 3 天。

enter image description here

我尝试过的:

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),无论哪天总和都相同。

sql presto
1个回答
0
投票

您可以在内部查询中获取开始-结束日期、前一天的 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....

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.