开窗函数

开窗函数的作用和聚合函数作用很类似,只是聚合函数一般和 group by 配合使用(在展示多列的情况下),计算结果只会返回指定列( group by 后面所跟的列)的一行结果,而开窗函数返回指定列(用户指定的任意列)的多行结果。

效果如下:

需求 -> 要查询出某个店铺从 2019 年 3 月 28 日至今的业绩信息(包括店铺编号,店铺名称,每一单的交易时间),并且在每一行最后一列展示出这段时间内的业绩总和。

如果使用聚合函数的话,跑不掉要用子查询语句,但如果使用开窗函数的话效果是这样的:

1
2
3
4
5
6
7
8
9
10
SELECT
r.retailer_id,
r.retailer_name,
t.finished_at,
t.deal_total,
sum(t.deal_total)
OVER () AS total
FROM transactions AS t
LEFT JOIN retailers AS r ON t.retailer_id = r.retailer_id
WHERE t.finished_at > to_date('2019-03-28 00:00:00', 'yyyy-mm-dd hh24:mi:ss') AND t.retailer_id = 10085;

通过 函数名(列)OVER(选项)直接在每行的最后一列展示出业绩总和。

附:一些常见用法

OVER():按所有列进行分组;

OVER(partition by p):按照 p 列进行分组;

OVER(partition by p order by o):按照 p 列进行分组,按照 o 列进行降序排序;

OVER 前可以加聚合函数 例如 SUM COUNT AVG 等;

OVER 前也可以加 first_value last_value 等;

WINDOW 子句 用来制定累加的方式;

rank() OVER(order by o) :根据 o 列进行降序排序,并展示出排名;

row_number() OVER(order by o):根据 o 列进行降序排序,并展示列号;

参考:

1,https://blog.csdn.net/mascf/article/details/50533922

2,https://blog.csdn.net/qq_26937525/article/details/54925827