评估移动每个 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;
我有以下 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;