1

leetcode 1082典型题 ,开窗函数

 

示例零: 

SELECT seller_id , RANK() OVER( ORDER BY SUM(price) DESC) AS r
,SUM(price) 
FROM Sales 
结果: 返回一条数据 , 没有partition 关键字,等于是全表做order by , 基于全表 做sum 排序 ,
其实这个sql 有问题.

| seller_id | rk | SUM(price) |
| --------- | -- | ---------- |
| 1 | 1 | 6400 |

  

示例 一: 

 SELECT seller_id, RANK() OVER( partition by seller_id    ORDER BY SUM(price) DESC) rk 
 ,SUM(price)
    FROM Sales

结果也是返回一条数据
| seller_id | rk | SUM(price) |
| --------- | -- | ---------- |
| 1 | 1 | 6400 |

 

 

示例二: 

 SELECT seller_id, RANK() OVER(    ORDER BY SUM(price) DESC) rk 
 ,SUM(price)
    FROM Sales
GROUP BY seller_id
结果: 如上sql会返回多条数据, 基于 seller_id 做分组了。



| seller_id | rk | SUM(price) |
| --------- | -- | ---------- |
| 1 | 1 | 2800 |
| 3 | 1 | 2800 |
| 2 | 3 | 800 |

示例三:

 SELECT seller_id, RANK() OVER( partition by seller_id    ORDER BY SUM(price) DESC) rk 
 ,SUM(price)
    FROM Sales
GROUP BY seller_id

| seller_id | rk | SUM(price) |
| --------- | -- | ---------- |
| 1 | 1 | 2800 |
| 2 | 1 | 800 |
| 3 | 1 | 2800 |


 

 

 

 

 

产品表:Product

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| product_id   | int     |
| product_name | varchar |
| unit_price   | int     |
+--------------+---------+
product_id 是这个表的主键(具有唯一值的列)。
该表的每一行显示每个产品的名称和价格。
销售表:Sales

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| seller_id   | int     |
| product_id  | int     |
| buyer_id    | int     |
| sale_date   | date    |
| quantity    | int     |
| price       | int     |
+------ ------+---------+
这个表它可以有重复的行。 
product_id 是 Product 表的外键(reference 列)。
该表的每一行包含关于一个销售的一些信息。
 

编写解决方案,找出总销售额最高的销售者,如果有并列的,就都展示出来。

以 任意顺序 返回结果表。

返回结果格式如下所示。

 

示例 1:

输入:
Product 表:
+------------+--------------+------------+
| product_id | product_name | unit_price |
+------------+--------------+------------+
| 1          | S8           | 1000       |
| 2          | G4           | 800        |
| 3          | iPhone       | 1400       |
+------------+--------------+------------+
Sales 表:
+-----------+------------+----------+------------+----------+-------+
| seller_id | product_id | buyer_id | sale_date  | quantity | price |
+-----------+------------+----------+------------+----------+-------+
| 1         | 1          | 1        | 2019-01-21 | 2        | 2000  |
| 1         | 2          | 2        | 2019-02-17 | 1        | 800   |
| 2         | 2          | 3        | 2019-06-02 | 1        | 800   |
| 3         | 3          | 4        | 2019-05-13 | 2        | 2800  |
+-----------+------------+----------+------------+----------+-------+
输出:
+-------------+
| seller_id   |
+-------------+
| 1           |
| 3           |
+-------------+
解释:Id 为 13 的销售者,销售总金额都为最高的 2800

 

如下是新案例.

案例1 .如下sql含义 : count(1) ,基于groupby 进行汇总求和, 然后排序 ,另外是全局排序.

select project_id,  count(1) , dense_rank() over (order by count(*) desc) as rk from Project group by project_id 





Project =
| project_id | employee_id |
| ---------- | ----------- |
| 1          | 1           |
| 1          | 2           |
| 1          | 3           |
| 2          | 1           |
| 2          | 4           |
 
输出
| project_id | count(1) | rk |
| ---------- | -------- | -- |
| 1          | 3        | 1  |
| 2          | 2        | 2  |

案例2 .
select project_id,  count(1) , dense_rank() over ( partition by project_id order by count(*) desc) as rk from Project group by project_id 

这个结果是区内排序, rk 那地方会有区别, 不加partition by 是全局排序.

案例3.
select project_id,  count(1) , dense_rank() over (  order by count(*) desc) as rk from Project  
不加 group by 等于是全局 count(1) ,只会返回一条结果, 没有意义的.

 

posted @ 2024-08-20 12:20  萌哥-爱学习  阅读(6)  评论(0编辑  收藏  举报