SELECTproduct_id,category,price
FROM (SELECTproduct_id,category,price,ROW_NUMBER() OVER (PARTITION BY category ORDER BY price) AS rankFROMyour_products_table
) AS ranked_products
WHERErank <= 3;
DENSE_RANK()
和 ROW_NUMBER()
是窗口函數(Window Function)中的兩個不同的排名函數,它們在處理相同排序條件時有一些區別。以下是它們的主要區別:
-
處理相同排名的方式:
- DENSE_RANK(): 具有相同排序值的行將具有相同的排名,且排名是連續的,不會有斷層。
- ROW_NUMBER(): 具有相同排序值的行將具有不同的排名,沒有連續性。
-
排名的跳躍:
- DENSE_RANK(): 在有相同排序值的行時,排名不會跳過任何整數值。例如,如果有兩個行具有相同的排序值并且排名為2,那么下一個排名將是3,而不是跳過為2的下一個整數值。
- ROW_NUMBER(): 在有相同排序值的行時,排名可能會跳過整數值。例如,如果有兩個行具有相同的排序值并且排名為2,下一個排名可能是4,跳過為3的整數值。
-
語法:
- DENSE_RANK(): 使用
DENSE_RANK() OVER (PARTITION BY ... ORDER BY ...)
。 - ROW_NUMBER(): 使用
ROW_NUMBER() OVER (PARTITION BY ... ORDER BY ...)
。
- DENSE_RANK(): 使用
通常情況下,如果你希望處理相同排序值的行并確保連續的排名,可以選擇使用 DENSE_RANK()
。如果你希望每個行都有唯一的排名,不考慮相同排序值的行,可以選擇使用 ROW_NUMBER()
。選擇哪個函數取決于你的具體需求。