一、窗口函数
1、什么是窗口函数
窗口函数也称为OLAP函数。OLAP的意思是对数据库数据进行实时分析处理。
2、窗口函数的语法
<窗口函数> OVER ( [PARTITION BY <列清单>]
ORDER BY <排列用列清单> )
能够作为窗口函数使用的函数
1、聚合函数(SUM、AVG、COUNT、MAX、MIN)
2、RANK、DENSE_RANK、ROW_NUMBER等专用窗口函数
3、语法的基本使用方法——使用RANK函数
-- 根据不同的商品种类,按照销售单价从低到高的顺序排序
SELECT product_name, product_type, sale_price,
RANK () OVER (PARTITION BY product_type
ORDER BY sale_price) AS ranking
FROM Product;
product_name | product_type | sale_price | ranking
--------------+--------------+------------+---------
圆珠笔 | 办公用品 | 100 | 1
打孔器 | 办公用品 | 500 | 2
叉子 | 厨房用具 | 500 | 1
擦菜板 | 厨房用具 | 880 | 2
菜刀 | 厨房用具 | 3000 | 3
高压锅 | 厨房用具 | 6800 | 4
T恤衫 | 衣服 | 1000 | 1
运动T恤 | 衣服 | 4000 | 2
RANK() OVER (...)
:这是一个窗口函数,用于在由PARTITION BY
和ORDER BY
定义的窗口内为每一行分配一个排名。
PARTITION BY
子句用于将数据分为不同的组。在每个组内,RANK()
函数将独立地进行排名。
ORDER BY
子句用于指定窗口内行的排序方式。可以通过关键字ASC/DESC来指定升序和降序,省略该关键字时会默认按照ASC,也就是升序进行排序。
SELECT product_name,product_type,sale_price,
RANK () OVER (PARTITION BY product_type
ORDER BY sale_price DESC) AS ranking
FROM Product;
4、无需指定PARTITION BY
-- 不指定PARTITION BY
SELECT product_name, product_type, sale_price,
RANK () OVER (ORDER BY sale_price) AS ranking
FROM Product;
product_name | product_type | sale_price | ranking
--------------+--------------+------------+---------
圆珠笔 | 办公用品 | 100 | 1
打孔器 | 办公用品 | 500 | 2
叉子 | 厨房用具 | 500 | 2
擦菜板 | 厨房用具 | 880 | 4
T恤衫 | 衣服 | 1000 | 5
菜刀 | 厨房用具 | 3000 | 6
运动T恤 | 衣服 | 4000 | 7
高压锅 | 厨房用具 | 6800 | 8
5、专用窗口函数的种类
RANK函数
存在相同位次的记录会跳过之后的位次。例如,有3条记录排在第一位时:1,1,1,4……
DENSE_RANK函数
存在相同谓词的记录不会跳过之后的位次。例如,有3条记录排在第一位时:1,1,1,2……