GROUPBY 和開窗函式執行順序的問題

萌哥-爱学习發表於2024-09-13
  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)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

相關文章