剖析 SQL 开窗函数的秘密:row_number, dense_rank, percent_rank
2023-01-06 13:46:14
揭秘开窗函数:row_number、dense_rank 和 percent_rank
在数据分析的世界中,开窗函数就像一把瑞士军刀,可以灵活地对数据进行分组、排序和计算。row_number、dense_rank 和 percent_rank 是 SQL 中最常用的三个开窗函数,掌握它们将极大地提升你的数据分析能力。
row_number:逐行编号
想象一下你有一份考试成绩表,想给每个学生分配一个唯一的排名。row_number 函数就是你的救星。它可以根据升序或降序等规则,为查询中的每一行生成一个行号。
row_number() OVER (PARTITION BY exam_id ORDER BY score DESC)
在这个例子中,row_number 将对每场考试(exam_id)中的学生成绩(score)进行降序排序,并分配行号。
dense_rank:跳过空缺的排名
dense_rank 函数与 row_number 类似,但它不会为并列的排名生成相同的排名。换句话说,dense_rank 确保了排名没有空缺。
dense_rank() OVER (PARTITION BY exam_id ORDER BY score DESC)
在我们的成绩表示例中,dense_rank 将跳过并列的排名。例如,如果两名学生并列获得第二名,dense_rank 将为他们分配相同的排名,但会跳过第三名。
percent_rank:比例排名
percent_rank 函数为排名增加了另一个维度,它将排名转换为百分比。这让你可以轻松看到每个排名在整个组中的比例。
percent_rank() OVER (PARTITION BY exam_id ORDER BY score DESC)
对于我们的成绩表示例,percent_rank 将显示每名学生的排名相对于其他学生的百分比。这可以帮助你快速了解学生在考试中的整体表现。
实战演练:排名销售人员
假设你有一份销售数据,想找出销售表现最好的销售人员。你可以使用 row_number 或 dense_rank 函数来排名销售人员,并使用 percent_rank 函数来了解每个销售人员的相对表现。
SELECT salesperson_name,
sales_amount,
row_number() OVER (ORDER BY sales_amount DESC) AS row_number,
dense_rank() OVER (ORDER BY sales_amount DESC) AS dense_rank,
percent_rank() OVER (ORDER BY sales_amount DESC) AS percent_rank
FROM sales_data;
结论
row_number、dense_rank 和 percent_rank 函数是强大的工具,可以帮助你轻松对数据进行排序和排名。无论是给学生排名还是识别销售高绩效者,这些函数都能让你快速有效地获得所需的信息。
常见问题解答
1. 什么是开窗函数?
开窗函数允许你在查询中对数据进行动态计算,并在每个组或窗口中分配值。
2. row_number、dense_rank 和 percent_rank 有什么区别?
row_number 生成逐行行号,dense_rank 跳过并列排名,percent_rank 将排名转换为百分比。
3. 如何使用 row_number 函数对数据进行排序?
使用 OVER 子句指定排序规则,例如:ORDER BY column_name ASC
。
4. dense_rank 函数如何处理并列排名?
dense_rank 跳过并列排名,确保没有空缺。
5. percent_rank 函数如何显示排名的百分比?
percent_rank 将排名除以组中行的总数,并将其乘以 100。