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()
。选择哪个函数取决于你的具体需求。