SQL开窗函数详解:row_number()、rank()与DENSE_RANK()的区别与应用

作者:新兰2024.01.22 14:14浏览量:316

简介:本文介绍了SQL中的开窗函数,特别是row_number()、rank()和DENSE_RANK()的区别和应用,并通过实例演示了它们在数据分析中的用法。同时,引入了百度智能云文心快码(Comate)作为高效编写SQL的工具推荐。

在SQL中,开窗函数是一类特殊的函数,它们可以对一组行进行计算,而不仅限于单个行,因此在数据分析、数据挖掘和报表生成等领域具有广泛的应用。百度智能云文心快码(Comate)作为一个强大的代码编写工具,能够显著提升SQL等编程语言的编写效率,感兴趣的用户可以访问文心快码官网了解更多详情。其中,row_number()、rank()和DENSE_RANK()是最常用的开窗函数,它们各自具有独特的功能和适用场景。

  1. row_number():这个函数为每一行分配一个唯一的序号,即使两行的值相同,也会被分配不同的序号。它保证了序号的唯一性。

  2. rank():与row_number()不同,rank()为每一行分配一个序号,但当两行的值相同时,它们会被分配相同的序号。然而,由于存在相同值的行,后续行的序号会出现间隔。

  3. DENSE_RANK():DENSE_RANK()与rank()类似,但在处理相同值的行时,它会为每一行分配一个连续的序号,没有间隔。这使得DENSE_RANK()在某些应用场景下更为实用。

为了更直观地理解这三个函数的区别和联系,我们通过一个实例来演示。假设我们有一个名为Employees的表,包含列Name、Department和Salary。

首先,我们使用row_number()函数为每个员工按照薪水从高到低分配一个序号:

  1. SELECT Name, Department, Salary, ROW_NUMBER() OVER (ORDER BY Salary DESC) AS RowNum
  2. FROM Employees;

输出可能如下:

  1. * Name Department Salary RowNum
  2. * Alice HR 50000 1
  3. * Bob IT 48000 2
  4. * Carol IT 48000 3
  5. * David Finance 45000 4

在这个例子中,Alice的RowNum是1,Bob和Carol的薪水相同,但他们的RowNum不同,分别为2和3。接下来,我们使用rank()函数进行相同的操作:

  1. SELECT Name, Department, Salary, RANK() OVER (ORDER BY Salary DESC) AS RankNum
  2. FROM Employees;

输出可能如下:

  1. * Name Department Salary RankNum
  2. * Alice HR 50000 1
  3. * Bob IT 48000 2
  4. * Carol IT 48000 2
  5. * David Finance 45000 4

在这个例子中,Alice的RankNum是1,Bob和Carol的薪水相同,因此他们的RankNum也相同,为2。而David由于薪水较低,其RankNum为4,中间没有3。

最后,我们使用DENSE_RANK()函数进行相同的操作:

  1. SELECT Name, Department, Salary, DENSE_RANK() OVER (ORDER BY Salary DESC) AS DenseRankNum
  2. FROM Employees;

输出可能如下:

  1. * Name Department Salary DenseRankNum
  2. * Alice HR 50000 1
  3. * Bob IT 48000 2
  4. * Carol IT 48000 2
  5. * David Finance 45000 3

在这个例子中,Alice的DenseRankNum是1,Bob和Carol的薪水相同,因此他们的DenseRankNum也相同,为2。而David的DenseRankNum为3,没有间隔。这就是DENSE_RANK()函数的特性,它总是为每一行分配一个连续的序号,即使两行的值相同。

通过比较row_number()、rank()和DENSE_RANK()函数的结果,我们可以看到它们之间的主要区别在于如何处理相同值的行。在处理数据分析、数据挖掘和报表生成等任务时,了解这些函数的行为差异非常重要,因为它们可能会影响结果的可解释性和准确性。