评估移动每个 ID 创建的最后 5 个订单

Evaluate moving last 5 orders created by each ID

我有以下 table:

create table DemoTable
(
   buyer_id INT,
   order_id INT,
   variable_a INT,
   created_date datetime
);

INSERT INTO DemoTable(buyer_id, order_id, variable_a, created_date) VALUES (54, 75, 609, '2019-06-02 16:46:53');
INSERT INTO DemoTable(buyer_id, order_id, variable_a, created_date) VALUES (54, 74, 363, '2019-06-01 22:00:00');
INSERT INTO DemoTable(buyer_id, order_id, variable_a, created_date) VALUES (54, 73, 300, '2019-06-01 20:00:02');
INSERT INTO DemoTable(buyer_id, order_id, variable_a, created_date) VALUES (54, 72, 225, '2019-06-01 18:12:03');
INSERT INTO DemoTable(buyer_id, order_id, variable_a, created_date) VALUES (54, 71, 110, '2019-06-01 16:10:03');
INSERT INTO DemoTable(buyer_id, order_id, variable_a, created_date) VALUES (54, 55, 213, '2019-06-01 14:22:03');
INSERT INTO DemoTable(buyer_id, order_id, variable_a, created_date) VALUES (54, 51, 225, '2018-12-01 16:12:03');
INSERT INTO DemoTable(buyer_id, order_id, variable_a, created_date) VALUES (54, 32, 110, '2018-12-01 15:10:03');
INSERT INTO DemoTable(buyer_id, order_id, variable_a, created_date) VALUES (54, 12, 213, '2018-12-01 12:22:03');
buyer_id order_id variable_a created_date
54 75 609 2019-06-0216:46:53
54 74 363 2019-06-0122:00:00
54 75 300 2019-06-0120:00:02
54 73 225 2019-06-0118:12:03
54 72 110 2019-06-0116:10:03
54 55 213 2019-06-0114:22:03
54 51 225 2018-12-0116:12:03
54 32 110 2018-12-0115:10:03
54 12 213 2018-12-0112:22:03

我需要做的是评估 buyer_id 创建的最后 5 个订单 (l5o) 并且它是每个 order_id 的移动 l5o。下面的例子是对最后5个订单的variable_a:

取平均值
buyer_id variable_a_avg_l5o created_date
54 321.4 2019-06-02
54 242.2 2019-06-01

2019-06-02: (609+363+300+225+110)/5 = 321.4

2019-06-01: (363+300+225+110+213)/5 = 242.2

请指导我如何应用这个逻辑。请注意,我使用的是 presto,目前尚不支持相关子查询。

谢谢!

如果我没理解错的话,您只需要一个 window 具有 window 框架规范的函数:

select t.*,
       avg(variable_a) over (partition by buyer_id
                             order by created_date
                             rows between 4 preceding and current row
                            ) as avg_5
from t;