create table order_tab(
order_id int,
user_no varchar(3),
amount int,
create_date date
);
insert into order_tab values
(101,'001',100,'2019-01-01'),
(211,'001',300,'2019-01-02'),
(308,'001',500,'2019-01-02'),
(415,'001',800,'2019-01-03'),
(523,'001',900,'2019-01-04'),
(612,'002',500,'2019-01-03'),
(718,'002',600,'2019-01-04'),
(804,'002',300,'2019-01-10'),
(911,'002',800,'2019-01-16'),
(1109,'002',800,'2019-01-22');
-- 查询所有订单总金额
select sum(amount) as 订单总金额 from order_tab;
select *,sum(amount) over() as 订单总金额 from order_tab;
#当over中没有指定分区、排序和滑动窗口范围时,表中所有记录为一个区,默认计算分区内的所有记录
-- 查询每个用户的订单总金额
select user_no,sum(amount) as 订单总金额
from order_tab
group by user_no;
select *,sum(amount) over(partition by user_no) as 订单总金额 from order_tab;
#当over中指定分区,但是没有指定排序和滑动窗口范围时,默认计算当前分区内的所有记录
-- 按下单时间顺序,查询每个用户的累积订单金额
select *,sum(amount) over(partition by user_no order by create_date) as 累积订单金额 from order_tab;
#当over中指定了排序,但是没有指定滑动窗口范围时,默认是基于值计算,计算当前分区内的第一行排序字段对应值到当前行排序字段对应值范围内的记录
-- 按订单编号顺序,查询每个用户的累积订单金额
select *,sum(amount) over(partition by user_no order by order_id) as 累积订单金额 from order_tab;
#当over中指定了排序,但是没有指定滑动窗口范围时,默认是基于值计算,计算当前分区内的第一行排序字段对应值到当前行排序字段对应值范围内的记录
-- 查询每个用户按单号顺序,前一笔到后一笔订单的平均订单金额
select *,avg(amount) over(partition by user_no order by order_id range between 1 preceding and 1 following) as 平均订单金额 from order_tab;
#当over中指定滑动窗口范围时,计算指定的范围内的记录
-- 查询每个用户按下单时间顺序,前一笔到后一笔订单的平均订单金额
select *,avg(amount) over(partition by user_no order by create_date range between interval 1 day preceding and interval 1 day following) as 平均订单金额 from order_tab;
#当over中指定滑动窗口范围时,计算指定的范围内的记录
-- 查询每个用户按下单时间顺序,前一笔到后一笔订单的平均订单金额
select *,avg(amount) over(partition by user_no order by create_date rows between 1 preceding and 1 following) as 平均订单金额 from order_tab;
#当over中指定滑动窗口范围时,计算指定的范围内的记录