SQL笔记#SQL高级处理

发布于:2025-02-27 ⋅ 阅读:(8) ⋅ 点赞:(0)

一、窗口函数

1、什么是窗口函数

        窗口函数也称为OLAP函数。OLAP的意思是对数据库数据进行实时分析处理。

2、窗口函数的语法

<窗口函数> OVER ( [PARTITION BY <列清单>]

                                                 ORDER BY <排列用列清单> )

\blacksquare 能够作为窗口函数使用的函数

\boldsymbol{}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、专用窗口函数的种类

\bullet RANK函数           

        存在相同位次的记录会跳过之后的位次。例如,有3条记录排在第一位时:1,1,1,4……

\bullet DENSE_RANK函数

        存在相同谓词的记录不会跳过之后的位次。例如,有3条记录排在第一位时:1,1,1,2……