1

GROUPBY 和开窗函数执行顺序的问题

  SELECT seller_id FROM 
(SELECT seller_id , RANK() OVER(ORDER BY SUM(price) DESC) AS r
FROM Sales GROUP BY seller_id) s
WHERE s.r=1;

作者:SunnyCCCh
链接:https://leetcode.cn/problems/sales-analysis-i/solutions/868818/partition-by-he-group-by-de-shi-yong-qu-nts8m/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。    

SELECT seller_id FROM 
(SELECT seller_id , RANK() OVER(PARTITION BY seller_id ORDER BY SUM(price) DESC) AS r
FROM Sales ) s
WHERE s.r=1;

作者:SunnyCCCh
链接:https://leetcode.cn/problems/sales-analysis-i/solutions/868818/partition-by-he-group-by-de-shi-yong-qu-nts8m/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


--案例1  这个案例等于是将  
  
SELECT SELLER_ID ,
         SUM(PRICE),
         DENSE_RANK() OVER( ORDER BY  SUM(PRICE) DESC ) RN --不分区. 留意最下面有group by ,groupby级别高于开窗函数计算顺序这个是重点.
FROM SALES A
GROUP BY  SELLER_ID


--如下结果:

| seller_id | sum(price) | dense_rank() over(  order by sum(price) desc ) |
| --------- | ---------- | ---------------------------------------------- |
| 1         | 2800       | 1                                              |
| 3         | 2800       | 1                                              |
| 2         | 800        | 2                                              |

另外需要注意的是 字段中有 partition by 然后最后面还要 group by 的话,这种sql 没有意义的,要重点体会一下。

 

注意子查询里面的执行顺序,是先from sales,再group by seller_id,最后再select,这样得到的就是seller_id和每个seller_id对应的sum(price)的排名。

如果换成partition by seller_id就是在每个seller_id组内对price排序了
结合1076和1077题一起体会下区别。

作者:SunnyCCCh
链接:https://leetcode.cn/problems/sales-analysis-i/solutions/868818/partition-by-he-group-by-de-shi-yong-qu-nts8m/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

posted @ 2024-09-13 17:57  萌哥-爱学习  阅读(35)  评论(0编辑  收藏  举报