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 为 1 和 3 的销售者,销售总金额都为最高的 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) ,只会返回一条结果, 没有意义的.